C++中关于类型转换的问题

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));//正确

我们无法使用强制类型转换来解决二义性问题,因为强制类型转换本身也面临二义性,这句话到底是什么意思啊?这不是通过强制类型转换实现了功能吗?

阅读 2.5k
2 个回答

这句话到底是什么意思啊?

这句话意为:(f(b)调用时存在二义性)使用强制类型转换(f(static_cast<A>(b))或者f((A)b))无法消除这个二义性。原句为:

Note that we can’t resolve the ambiguity by using a cast—the cast
itself would have the same ambiguity.


这不是通过强制类型转换实现了功能吗?

没有,例子中的两次正确调用都未使用强制转换。第一次调用是通过显式调用B的转换函数(conversion function)消除二义性,第二次调用是通过显式类型转换来消除二义性。

简单的说,在这里使用强制类型转换无法消除调用的二义性是因为,强制转换本身需要一个可行的转换序列,但可以通过转换构造函数(converting constructor)和转换函数分别获得两个可行的转换序列,且两者不存在优劣(?)之分。


非相关:
但这里是否有真的有二义性似乎存疑。

意思就是c++对于这个强制转换并没有规定是如何强制转换的,它既可以选择A的构造函数也可以选择B的重载,选择哪个怎么实现是由ide自己来决定的。不同版本的ide是有不同的实现。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏