, 및 아마는 키워드 여기 아마입니다
밖으로 최적화 될 수 있습니다. 표준을 사용하면 컴파일러가 복사를 최적화 할 수 있지만 필요하지는 않습니다. 일부 컴파일러가이 코드를 허용 (최적화 됨)했지만 다른 컴파일러가 거부 (최적화되지 않음) 한 경우 매우 일관성이 없습니다.
그래서 표준에서는이 문제를 일관된 방식으로 처리하도록 규정합니다. 모든 사람이 복사 생성자가 액세스 할 수 있는지 여부를 확인해야합니다.
모든 컴파일러는 코드를 수락하거나 거부해야합니다. 그렇지 않으면 휴대용이 아닙니다.
또 다른 예를 들어,
A a;
B b;
A a1 = a;
A a2 = b;
a2
을 허용 똑같이 일치하지 않을 것이라고 생각하지만 a1
A
의 복사 생성자이 비공개 금지하고 있습니다.
우리는 또한 클래스 객체를 초기화하는 두 가지 방법이 다른 의도되었다는 표준 텍스트에서 볼 수
(8.5/16) :
초기화가 직접 초기화 경우, 또는 그것이 복사 - 초기화 인 경우, 소스 형의 비 정규화 된 버젼이 목적지의 클래스와 같은 클래스 또는 파생 클래스 인 경우, 생성자가 고려됩니다. 적용 가능한 생성자는 열거되고 (13.3.1.3), 과부하 해결 (13.3)을 통해 최상의 생성자가 선택됩니다. 이렇게 선택된 생성자는 이니셜 라이저 표현식 또는 표현식 목록을 인수로 사용하여 객체를 초기화하기 위해 호출됩니다. 생성자가 적용되지 않거나 과부하 해결이 모호하면 초기화가 잘못됩니다. 그렇지 않은 경우 (즉, 나머지 복사 초기화의 경우) 소스 유형에서 대상 유형으로 변환 할 수있는 사용자 정의 변환 시퀀스 또는 변환 함수 사용시 파생 클래스로 열거됩니다. 13.3.1.4에서 설명하고 가장 좋은 것은 과부하 해결 (13.3)을 통해 선택됩니다. 변환을 수행 할 수 없거나 모호한 경우 초기화가 잘못되었습니다. 선택된 함수는 이니셜 라이저 식을 인수로 사용하여 호출됩니다. 함수가 생성자 인 경우, 호출은 목적지 유형의 cv-unqualified 버전의 임시 버전을 초기화합니다. 임시는 값입니다.그런 다음 호출의 결과 (생성자의 경우 임시 임)가 위의 규칙에 따라 복사 초기화의 대상인 객체를 직접 초기화하는 데 사용됩니다. 특정의 경우, 구현은 직접 초기화되는 객체에 중간 결과를 직접 구축하여이 직접 초기화에 내재 된 복사를 제거 할 수 있습니다. 12.2, 12.8 참조.
직접 초기화는 생성 된 클래스의 생성자를 직접 사용한다는 점이 다릅니다. 카피 - 초기화 (copy-initialization)에서, 다른 변환 함수들이 고려되고, 이들은 복사되어야하는 임시를 생성 할 수있다.
편집을 진행했습니다. 내가 무엇인가를 엉망으로 만들었 으면 다시 넣어주세요 :-) –
@SteveJessop : 언어 변호사라고 써야합니다. –
@Als : 아마도 태그의 목적을 모르겠습니다. 질문의 아이디어는 실제로 사양이 * 말하고있는 것에 대해 미세한 털을 나누는 것이 아닙니다. 그러나 그것이 내가 언어 변호사라고 생각하는 것입니다. 그게 허용된다면 나는 언어 디자인에 태그를 달고 싶다. –