2014-09-18 2 views
0

벡터의 모든 포인터를 NULL로 초기화하려고합니다. 스레드 기반으로 : initialize vector of pointers (automatically)How to initialize a vector of pointers벡터에서 포인터를 초기화하십시오.

난 그냥 내가 원하는 것을 달성하기 위해 벡터 생성자를 사용할 수 있습니다. 내 질문은 : 초기화 NULL 포인터는 표준 동작인가? 또는 벡터의 포인터가 일부 컴파일러에서 NULL이 아닐 수도 있습니다. NULL로 초기화하는 것이 표준이라면 누구나 내게 어떤 장과 단원을 C++ 표준에서 관련 정보를 찾을 수 있는지 말해 줄 수 있습니까?

감사합니다,

답변

5

난 당신이 같은 것을 의미 가정

std::vector<MyClass*> v(10); 

예, 벡터는 널 포인터로 초기화됩니다. 장과 절에 어느 정도 관여하여 표준 ...

C++ 14 §23.3.6.2 "`벡터 생성자, 복사 및 할당"인용 :

explicit vector(size_type n, const Allocator& = Allocator());

을 효과 :를 구축 a vectorn으로 지정된 할당자를 사용하는 기본 삽입 요소.

이 필요합니다T*thisDefaultInsertable을한다.

§23.2.1 "일반 컨테이너 요구 사항"¶13 :

-TXDefaultInsertable입니다 다음과 같은 표현이 잘 형성되어 있음을 의미합니다 :

allocator_traits<A>::construct(m, p) 

- X의 요소는 평가로 초기화되는 경우 이 기본으로 삽입 된입니다. pX 내에 할당 요소의 초기화 저장소의 주소 표현

allocator_traits<A>::construct(m, p) 

F.

는 §20.7.8.2 ¶5 "할당자는 멤버 함수를 형질이"

template <class T, class... Args> 
    static void construct(Alloc& a, T* p, Args&&... args); 

효과 : 통화 a.construct(p, std::forward<Args>(args)...) 그런 통화가 잘 형성되어있는 경우; 그렇지 않으면 ::new (static_cast<void*>(p)) T(std::forward<Args>(args)...)을 호출합니다.

§20.7.9.1 "[기본] allocator 부재"¶12 :

template <class U, class... Args> 
    void construct(U* p, Args&&... args); 

효과 :::new((void *)p) U(std::forward<Args>(args)...)

위로 §23.2.1 ¶13을 참조하면, args가 비어있는 것을 알 수있다. 따라서 ...

§8.5 "이니셜"

이니셜 빈} 인 목적, 즉 ()가한다 값으로 초기화.

동일한 섹션 :

에 입력 T의 목적 수단 값을 초기화 ... 그렇지 않으면, 객체는 제로 - 초기화된다. T 스칼라 타입 (3.9) 개체에 의해 얻어진 값으로 초기화되는 경우, ... :

동일한 섹션 :

대상물 또는 유형 T의 기준 수단 제로 초기화 정수 리터럴 0 (제로)을 T으로 변환합니다. 106

각주 106 :

리터럴 값이 널 (null) 포인터 값으로 포인터 타입 결과 0 정수 변환, 4.10에서 규정

.

+0

awesome thanks :) – r0ng

관련 문제