C++中关于类型转换的问题
阿神
阿神 2017-04-17 15:25:18
0
2
440

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)
阿神

這句話到底是什麼意思啊?

這句話意為:(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是有不同的實作。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板