[英]Why user-defined conversion is not implicitly taking place on the calling object
考慮以下A
和B
類定義:
class A {
public:
void func() const {}
};
class B {
public:
// user-defined conversion operator to A
operator A() const { return a_; }
private:
A a_;
};
類A
定義了一個稱為func()
的公共成員函數。 類B
沒有,但是它確實將用戶定義的轉換運算符定義為類型A
這樣,可以將B
的實例轉換為 A
的實例。 以下代碼按預期工作:
B b;
static_cast<A>(b).func(); // call func() on temporary instance of A
在上面的代碼中,轉換操作符是通過名為cast的static_cast
隱式調用的。
請注意, B
中的轉換運算符未指定為explicit
,以便也允許隱式轉換。 但是,以下代碼無法編譯:
B b;
b.func(); // <-- error: 'class B' has no member named 'func'
就像錯誤消息所說的那樣,類B
沒有名為func
成員,但是類A
,而類B
的用戶定義的轉換運算符是A
在這種情況下, 不會隱式調用用戶定義的轉換運算符。
為什么沒有隱式完成轉換?
成員訪問不考慮轉換(第5.2.5 / 2節[expr.ref])。
在任何一種情況下, id表達式均應命名該類或其基類之一的成員
這里的id表達式是func()
因此,編譯器認為func
必須是B
的成員或B
派生的類。 不考慮隱式轉換為可能具有func
成員的其他類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.