찾다

 >  Q&A  >  본문

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

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

阿神阿神2772일 전444

모든 응답(2)나는 대답할 것이다

  • 阿神

    阿神2017-04-17 15:27:18

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

    这句话意为:(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)和转换函数分别获得两个可行的转换序列,且两者不存在优劣(?)之分。


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

    회신하다
    0
  • 黄舟

    黄舟2017-04-17 15:27:18

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

    회신하다
    0
  • 취소회신하다