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

查看:87
本文介绍了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));//正确

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

解决方案

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

这句话意为:(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++中关于类型转换的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆