관련이있는 경우
잠시 동안 그것이 B
실제로 D
. 그런 다음에 대한 호출의 경우 및 로 변환 할 수 check
있기 때문에 두 버전이 모두 실행 가능 합니다. from to 및 각각 에서 설명하는 사용자 정의 변환 시퀀스 입니다. 클래스를 변환 할 수있는 변환 함수를 찾기 위해 다음과 같은 후보 함수를 첫 번째 함수 로 합성합니다.Host
D*
B*
13.3.3.1.2
Host<B, D>
D*
B*
check
13.3.1.5/1
D* (Host<B, D>&)
로 변환 B*
할 수 없기 때문에 첫 번째 변환 함수는 후보가 아닙니다 D*
.
두 번째 기능의 경우 다음 후보가 존재합니다.
B* (Host<B, D> const&)
D* (Host<B, D>&)
이들은 호스트 개체를 취하는 두 가지 변환 함수 후보입니다. 첫 번째는 const 참조로 가져오고 두 번째는 그렇지 않습니다. 따라서 두 번째는에 의해 상수가 아닌 *this
객체 ( 내포 된 객체 인수 ) 13.3.3.2/3b1sb4
와 더 잘 일치 B*
하며 두 번째 check
함수 에 대해 변환하는 데 사용됩니다 .
당신이 할 경우 제거 를 const, 우리는 다음과 같은 후보를 것
B* (Host<B, D>&)
D* (Host<B, D>&)
이것은 우리가 더 이상 constness로 선택할 수 없다는 것을 의미합니다. 일반적인 오버로드 확인 시나리오에서는 일반적으로 반환 형식이 오버로드 확인에 참여하지 않기 때문에 호출이 모호해집니다. 그러나 변환 기능의 경우 백도어가 있습니다. 두 개의 변환 함수가 똑같이 좋은 경우 반환 유형에 따라 누가 가장 적합한 지 결정됩니다 13.3.3/1
. 당신이 const를 제거 할 경우에 따라서, 그 첫 번째는 때문에, 촬영 될 것이다 B*
변환 더 나은에 B*
비해 D*
까지 B*
.
이제 어떤 사용자 정의 변환 시퀀스가 더 낫습니까? 두 번째 또는 첫 번째 확인 기능을위한 것? 규칙은 사용자 정의 변환 시퀀스가에 따라 동일한 변환 함수 또는 생성자를 사용하는 경우에만 비교할 수 있다는 것 13.3.3.2/3b2
입니다. 이것이 바로 여기에 해당됩니다. 둘 다 두 번째 변환 함수를 사용합니다. 따라서 const 는 컴파일러가 두 번째 변환 함수를 사용하도록 강제하기 때문에 중요합니다.
비교할 수 있기 때문에 어느 것이 더 낫습니까? 규칙은 변환 함수의 반환 유형에서 대상 유형으로의 더 나은 변환이이기는 것입니다 (다시 말함 13.3.3.2/3b2
). 이 경우 D*
는 D*
보다에서 B*
. 따라서 첫 번째 기능이 선택되고 상속을 인식합니다!
우리가 필요하지도 것을 알 수 실제로 기본 클래스로 변환, 우리하여 인식 할 수있는 개인 상속을 우리가에서 변환 할 수 있는지 여부 있기 때문에 D*
A와가 B*
에 따라 상속의 형태에 의존하지 않는다4.10/3
관련이없는 경우
이제 상속과 관련이 없다고 가정 해 봅시다. 따라서 첫 번째 기능의 경우 다음 후보가 있습니다.
D* (Host<B, D>&)
그리고 두 번째로 우리는 이제 다른 세트가 있습니다
B* (Host<B, D> const&)
우리는 변환 할 수 없습니다 이후 D*
에 B*
우리가 상속 관계를 가지고하지 않은 경우, 우리는 지금 두 개의 사용자 정의 변환 시퀀스 사이에 공통 변환 기능이 없다! 따라서 첫 번째 함수가 템플릿이라는 사실이 아니라면 모호 합니다. 에 따라 똑같이 좋은 템플릿이 아닌 기능이있을 때 템플릿이 두 번째 선택 13.3.3/1
입니다. 따라서, 우리는 비 템플릿 함수 (두 번째)을 선택하고 우리 간의 상속 없다는 것을 인식 B
하고 D
!