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)
)无法消除这个二义性。原句为:没有,例子中的两次正确调用都未使用强制转换。第一次调用是通过显式调用B的转换函数(conversion function)消除二义性,第二次调用是通过显式类型转换来消除二义性。
简单的说,在这里使用强制类型转换无法消除调用的二义性是因为,强制转换本身需要一个可行的转换序列,但可以通过转换构造函数(converting constructor)和转换函数分别获得两个可行的转换序列,且两者不存在优劣(?)之分。
非相关:
但这里是否有真的有二义性似乎存疑。
意思就是c++对于这个强制转换并没有规定是如何强制转换的,它既可以选择A的构造函数也可以选择B的重载,选择哪个怎么实现是由ide自己来决定的。不同版本的ide是有不同的实现。