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));//正确
我们无法使用强制类型转换来解决二义性问题,因为强制类型转换本身也面临二义性,这句话到底是什么意思啊?这不是通过强制类型转换实现了功能吗?
阿神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)和轉換函數分別獲得兩個可行的轉換序列,且兩者不存在優劣(?)之分。
非相關:
但這裡是否有真的有二義性似乎存疑。
黄舟2017-04-17 15:27:18
意思就是c++對於這個強制轉換並沒有規定是如何強制轉換的,它既可以選擇A的構造函數也可以選擇B的重載,選擇哪個怎麼實現是由ide自己來決定的。不同版本的ide是有不同的實作。