C++ 11 이전에는 A a = A(1);
과 다소 비슷한 A a = 1;
을 작성하여 복사 초기화를 수행 할 수 있습니다. 즉, 임시가 먼저 작성된 후 사본 ctor가 호출됩니다. 복사본 추출에 관계없이 개념적으로 그렇게해야하며 복사본 식별자에 액세스 할 수 있어야합니다.복사 목록 초기화가 개념적으로 복사기를 호출합니까?
C++ 11에서 목록을 초기화하면 A a = {1, 2};
을 작성하여 복사본 목록을 초기화 할 수 있습니다. 제 생각에는 A a = A(1, 2);
과 다소 비슷합니다. 그러나 GCC와 clang의 경우 A a = {1, 2}
은 복사 및 이동 도구에 액세스 할 수없는 경우에도 (개인용으로 선언하여) 컴파일됩니다. 그래도 A a = 1;
은 GCC에서 컴파일되지 않거나 해당 복사/이동 아이콘에 액세스 할 수없는 경우 clang하지 않습니다. 따라서 A a = {1, 2};
은 직접 목록 초기화 인 A a{1, 2};
과 다소 비슷합니다. 이 사실과 실제 직접 목록 초기화의 차이점은 두 개의 int를 취하는 ctor가 명시적인 경우 A a = {1, 2};
이 컴파일되지 않는다는 것입니다. 이 측면에서 A a = {1, 2};
은 복사본 초기화와 비슷합니다.
제 질문은 : A a = {1, 2};
과 같은 표현의 정확한 의미는 무엇입니까? 에 의해 개념적으로, 복사 elision은 방해가되지 않습니다.
질문에 모든 것을 직접 설명해 주셨습니다. 카피리스트 초기화는 명시적인 생성자를 고려하지 않는 것을 제외하고 직접리스트 초기화와 동일하다. 어느 쪽도 액세스 가능한 복사 생성자가 필요하지 않습니다. – Praetorian
@Praetorian 이것은 정확하게 이것처럼 보이지 않습니다. 콜롬보의 대답에 대한 내 의견을 참조하십시오. – Lingxi