簡體   English   中英

為什么沒有在調用對象上隱式進行用戶定義的轉換

[英]Why user-defined conversion is not implicitly taking place on the calling object

考慮以下AB類定義:

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

在上面的代碼中,轉換操作符是通過名為caststatic_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM