C++ Primer上说,
struct B; struct A{ A()=default; A(const B&); }; struct B{ operator A() const; } A f(const A&); B b; A a=f(b);//二义性错误 A a1=f(b.operator A());//正确 A a2=f(A(b));//正确
我们无法使用强制类型转换来解决二义性问题,因为强制类型转换本身也面临二义性,这句话到底是什么意思啊?这不是通过强制类型转换实现了功能吗?
闭关修行中......
이 문장은 정확히 무슨 뜻인가요?
이 문장의 의미는 다음과 같습니다. (f(b) 호출 시 모호성이 있습니다.) 이 모호성은 강제 유형 변환(f(static_cast<A>(b)) 또는 f((A)b))을 사용해도 제거될 수 없습니다. 원래 문장은 다음과 같습니다.
f(b)
f(static_cast<A>(b))
f((A)b)
캐스트를 사용하여 모호성을 해결할 수는 없습니다. 캐스트 자체도 동일한 모호성을 갖게 됩니다.
이 기능은 강제 형 변환을 통해 구현된 것 아닌가요?
아니요, 예제의 두 가지 올바른 호출 중 어느 것도 캐스트를 사용하지 않습니다. 첫 번째 호출은 B의 변환 함수를 명시적으로 호출하여 모호성을 제거하고, 두 번째 호출은 B의 변환 함수를 명시적으로 호출하여 모호성을 제거합니다.
간단히 말하면 여기서 캐스트 유형 변환을 사용하면 캐스트 자체에 실행 가능한 변환 시퀀스가 필요하기 때문에 호출의 모호성을 제거할 수 없지만 변환 생성자 및 실행 가능한 변환 시퀀스를 통해 각각 두 개를 얻을 수 있습니다. 둘 사이에는 우열(?)이 없습니다.
관련 없음: 그러나 여기에 실제 모호성이 있는지 여부는 의심스러워 보입니다.
C 에서는 강제 변환 방법을 지정하지 않는다는 의미입니다. A의 생성자나 B의 오버로드 중 하나를 선택할 수 있습니다. 어느 것을 선택하고 구현하는 방법은 IDE 자체에서 결정됩니다. IDE 버전마다 구현 방식이 다릅니다.
이 문장의 의미는 다음과 같습니다. (
f(b)
호출 시 모호성이 있습니다.) 이 모호성은 강제 유형 변환(f(static_cast<A>(b))
또는f((A)b)
)을 사용해도 제거될 수 없습니다. 원래 문장은 다음과 같습니다.아니요, 예제의 두 가지 올바른 호출 중 어느 것도 캐스트를 사용하지 않습니다. 첫 번째 호출은 B의 변환 함수를 명시적으로 호출하여 모호성을 제거하고, 두 번째 호출은 B의 변환 함수를 명시적으로 호출하여 모호성을 제거합니다.
간단히 말하면 여기서 캐스트 유형 변환을 사용하면 캐스트 자체에 실행 가능한 변환 시퀀스가 필요하기 때문에 호출의 모호성을 제거할 수 없지만 변환 생성자 및 실행 가능한 변환 시퀀스를 통해 각각 두 개를 얻을 수 있습니다. 둘 사이에는 우열(?)이 없습니다.
관련 없음:
그러나 여기에 실제 모호성이 있는지 여부는 의심스러워 보입니다.
C 에서는 강제 변환 방법을 지정하지 않는다는 의미입니다. A의 생성자나 B의 오버로드 중 하나를 선택할 수 있습니다. 어느 것을 선택하고 구현하는 방법은 IDE 자체에서 결정됩니다. IDE 버전마다 구현 방식이 다릅니다.