4

proposal에서 추론하기가 어려웠습니다.
C++ 17 구조화 된 바인딩은 식별자를 왼쪽에서 오른쪽으로 초기화합니까?구조화 된 바인딩의 idendifier가 순서대로 초기화됩니까?

"first", "second", "third"를 인쇄 할 수 있습니까?

#include <iostream> 

struct A{ A(){std::cout << "first\n"; } }; 
struct B{ B(){std::cout << "second\n"; } }; 
struct C{ C(){std::cout << "third\n"; } }; 

struct D{ 
    A first; 
    B second; 
    C third; 
}; 

auto f(){ 
    return D{}; 
} 

int main(){ 
    auto [a,b,c] = f(); 
} 
+0

제안서 (친절하고 환영하는 말)를 읽은 후에 나는 그것이 "추론하기 어렵다"라고 말할 것입니다. 그러나 불가능한 *. 제안서에 몇 가지 예가 나와 있지만 평가 순서 나 순서에 대해서는 명시 적으로 언급하지 않습니다. –

+1

나는 C++이 선언 순서에 의한 클래스에서 이미 객체 초기화 시퀀스를 정의했다고 생각 하나? – Mine

+1

@JoachimPileborg 오른쪽. 나는 문법 추가에서 분명히 기대하고있다. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0217r2.html –

답변

1

struct D의 생성자 대신 아니지만 Structured bindings 의해 다음 "세 번째", "두 번째", "제"출력을 보장한다.

f() 호출이 struct D의 인스턴스를 생성하고 D의 생성자가 호출되며 D의 개체 A, B, C는으로 초기화된다는 것을 의미 선언의 순서에 의해 초기화 될 "첫 번째", "두 번째", "세 번째"가 인쇄됩니다.

그러나 나는 Structured bindings 님의 초기화 순서가 정의 된 방법을 모르겠습니다.

3

구조적 바인딩이 없습니다 복사 값; 그것 참조. 귀하의 예에서 a은 반환 값의 첫 번째 구성원의 복사본이 아닙니다. 그것은 그것에 대한 참조입니다. 값 대신 참조를 초기화하기 때문에 생성자 호출 순서를 확인하여 초기화 순서를 감지 할 수 없습니다.

공용 멤버가있는 구조체의 경우 해당 프로세스를 방해 할 수 없기 때문에 이러한 참조를 가져 오는 순서는 관계가 없습니다. 구조화 된 바인딩을 사용하는 메소드를 구현하는 사용자 정의 구조체의 경우에는 다른 이야기입니다.

그러나 현재 C++ 17 CD에 투표 된 최종 표준 문구는 사용할 수 없습니다. 따라서 그러한 인터페이스 함수가 ​​어떤 순서로 호출되는지 또는 그것이 순서를 지정하는지 여부를 아는 것은 불가능합니다.