12

따라서 C++ 표준에서는 생성자의 이니셜 라이저 목록에서 언급 한 순서가 아니라 클래스에서 선언 된 순서대로 클래스 멤버를 초기화해야합니다. 그러나 이것은 초기화에 대한 논증이 평가되는 순서와 관련이 없습니다. 전 주변에서 직렬화 객체에 대한 참조를 자주 전달하는 시스템과 함께 작업하고 있는데, 비트가 객체의 필드에 쓰여지는 순서와 관계없이 비트가 올바른 순서로 읽혀질 수 있는지 궁금합니다.초기화 목록 * 인수 * 평가 순서

struct Foo { 
    int a; 
    double b; 
    // I want to be able to do this 
    Foo(SerObj &s) 
    : b(s.readDouble()), a(s.readInt()) 
    { } 
    // Rather than this 
    Foo (SerObj &s) 
    { 
     b = s.readDouble(); 
     a = s.readInt(); 
    } 
}; 

은 물론, 선언 intsdoubles 같은 재정렬 일들이 너무 큰 문제가 아니라,하지만 때로는 동적 할당을 필요로하는 물체와 일이 될 수 있습니다.

+0

나는 처음에는 주문이 다르다는 것을 알았다. hehe :) –

답변

21

C++ 표준은 12.6.2/3 :

각베이스 부재의 초기화 후에 시퀀스 점 (1.9)이있다. mem-initializer의 expression-list는 해당 기본 또는 멤버의 초기화의 일부로 평가됩니다.

초기화 순서는 질문에서 지정한 순서입니다. 평가는이 초기화의 일부이며 초기화는 인터리브 할 수 없습니다 (둘 사이에 시퀀스 포인트가 있기 때문에).

즉, 이니셜 라이저 목록의 함수 호출은 원하는 순서대로 호출되지 않고 멤버 선언이 나타나는 순서대로 수행됩니다.

+0

소스에 대한 링크를 추가 할 수 있었습니까? 감사. –

+0

죄송합니다. 잘못 읽었지만 각 초기화에서 멤버 생성자에 대한 인수의 평가 순서에 대한 질문이 아니십니까? 어느 것이 정의되지 않아야합니까? –

+0

흠, 각각 하나의 인수 만 있기 때문에 아마 그렇지 않을 것입니다. –