2011-08-27 6 views
4

N3257에서이없는 생성자없이 멤버를 초기화하는 예제를 발견했습니다. POD이기 때문에 가능하다고 생각합니다.C++ 0x 생성자없는 멤버 초기화

template<typename T> 
struct adaptor { 
    NonStdContainer<T>& ptr;    // <- data member, now REF 
    T* begin() { return ptr->getFirst(); } 
    T* end() { return ptr->getLast() + 1; } 
}; 
void f(NonStdContainer<int>& c) { 
    for (auto i : adaptor<int>{c})   // <- init 
     { /* ... */ } 
} 

이 GCC-4.7와 경고없이 벌금과 컴파일 : 나는 원시 포인터를 싫어하기 때문에이 예제와 함께 놀았

template<typename T> 
struct adaptor { 
    NonStdContainer<T>* ptr;    // <- data member 
    T* begin() { return ptr->getFirst(); } 
    T* end() { return ptr->getLast() + 1; } 
}; 
void f(NonStdContainer<int>& c) { 
    for (auto i : adaptor<int>{&c})   // <- init 
     { /* ... */ } 
} 

는 I는 &으로 *을 교체했다. 0.

그렇다면 POD 초기화에 대해 궁금해하고 C++ 0x로 변경되었을 수 있습니다. Bjarnes FAQ을 발견했습니다. 그는 POD가 포인터을 포함 할 수도 있지만 참조을 포함 할 수 없다고 말합니다.

옵스는, 지금은 궁금해 :

  • 내가 컴파일러는 생성자없이 어쨌든를 초기화 할 수있는, 여기에 비 POD-개체가 난 그냥 여기에 사용되는 메커니즘을 그리워합니까?
  • 또는 GCC-4.7.0이 non-std처럼 동작합니까?이 방법으로 참조를 초기화 할 수 있습니까?
  • 또는 Bjarnes FAQ에서 POD에서 참조를 허용하기 때문에 표준이 변경 되었습니까?

업데이트 : 발견집계 현재 표준에 (8.5.1 집계 [dcl.init.aggr])하지만, 참고 문헌이 언급되지 않은, 그래서 나는 확실하지 않다 어떻게 표준 [dcl.init.aggr] 인용이

답변

4

관련 : 집합체 배열 또는 클래스 (조 9)에는 사용자가 제공 생성자 함께

(12.1), (9.2), 비공개 또는 보호 된 비 정적 데이터 멤버 (11 절), 기본 클래스 없음 (10 절) 및 가상 기능 없음 (10.3)에 대한 중괄호 또는 동등 - 이니셜 라이저가 없습니다. . 특정한이 8.5.4에 에드로 골재가 이니셜 라이저리스트로 초기화

는 초기화리스트의 요소들은 첨자 하거나 부재 증가하는 순서로, 상기 집합의 구성원 초기화로 간주된다. 각 멤버는 해당 이니셜 라이저 절에서 복사 초기화됩니다 ...

즉, 집계가 있으므로 집계를 초기화 할 수 있습니다. POD는 그와 아무 상관이 없습니다. 예를 들어, POD는 실제로는 예를 들어 통신과 관련이 있습니다. 기음.그건 그냥

T& ref = c; 

내가 컴파일러 어쨌든 생성자없이 초기화 할 수있는, 여기에 비 POD 객체가 있습니까 의미하기 때문에 변수와 참조의

복사 초기화는 확실히 법적 나는 여기에서 어떤 메커니즘이 사용되는지 놓치고 있나?

예, 개체는 POD가 아닙니다.

GCC-4.7.0은이 방식으로 참조를 초기화함으로써 비정상적으로 동작합니까?

번호

+0

나는 당신과 동의하는 경향이있다. 나는이 질문을하고 POD와의 차이를 알지 못하고 * aggregates +의 정의를 발견했다. – towi

+0

@towi : 초기화를 살펴 보는 것이 가장 좋습니다. 집계를 직접 참조합니다. – jpalecek