9

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은 방해가되지 않습니다.

+2

질문에 모든 것을 직접 설명해 주셨습니다. 카피리스트 초기화는 명시적인 생성자를 고려하지 않는 것을 제외하고 직접리스트 초기화와 동일하다. 어느 쪽도 액세스 가능한 복사 생성자가 필요하지 않습니다. – Praetorian

+0

@Praetorian 이것은 정확하게 이것처럼 보이지 않습니다. 콜롬보의 대답에 대한 내 의견을 참조하십시오. – Lingxi

답변

9

표준은 매우 잘 설명합니다. [dcl.init.list]/3

  • [...]
  • 를 그렇지 T 경우, 다음과 같이 목적이나 종류 T의 기준

    리스트 초기화 정의 클래스 유형이므로 생성자가 고려됩니다. 적용 가능한 생성자가 열거되고 가장 좋은 것이 과부하 해결 (13.3, 13.3.1.7)을 통해 으로 선택됩니다. 인수를 변환하기 위해 좁은 변환 (아래 참조)이 필요하면 프로그램이 잘못되었습니다.

[over.match.list (강조 광산)

비 집합체 클래스 타입 T의 목적은리스트 초기화 (8.5.4)이며, 과부하 해상도 선택하는 두 단계의 생성자 :

  • 는 처음에는 후보 함수는 클래스 T의 초기화리스트 생성자 (8.5.4) 및 인수 목록 콘입니다 의 이니셜 라이저 목록을 단일 인수로 사용합니다. 더 가능한 초기화리스트 생성자가 발견되지 않는 경우

  • , 오버로드 확인이 후보 함수가 모든 하여 클래스 T의 생성자와 인수 목록이 초기화 목록의 요소로 구성되어있는 경우, 다시 수행된다. 이니셜리스트가 더 요소가없고 T에 기본 생성자가

경우, 첫번째 단계는 생략된다.
복사 목록 초기화에서 explicit 생성자를 선택한 경우 초기화가 잘못되었습니다.

따라서 이니셜 라이저 목록 구성 요소가없는 경우 (해당 경우) 초기화 목록의 요소가 생성자 호출의 인수가됩니다.
실제로 의 직접 목록 초기화와 사본 목록 초기화의 차이점은 마지막 굵은 문장으로 설명됩니다.

이것은 목록 초기화의 장점 중 하나입니다. 어쨌든 사용되지 않을 특별한 멤버 함수가 필요하지 않습니다.

+0

그런 다음, 값 전달 함수 호출 (예 :'f ({1, 2}); '의 컨텍스트에서 copy-list-initialization을 설명하는 방법. GCC와 clang에서는 복사/이동 ctor에 액세스 할 수 있어야합니다. 그렇지 않으면이 프로그램이 컴파일되지 않습니다. – Lingxi

+3

@Lingxi [** Really? **] (http://coliru.stacked-crooked.com/a/d85bfae98f38bea3) – Columbo

+0

cppreference.com의 임베디드 온라인 컴파일러에서 테스트했습니다. 예 : http://en.cppreference.com/w/cpp/language/explicit 하단에서 찾을 수 있습니다. – Lingxi