搜尋

首頁  >  問答  >  主體

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 天前443

全部回覆(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
  • 取消回覆