2011-04-29 22 views
3
#include <iostream> 
using namespace std; 

struct A 
{ 
    A(int a):a(a){} 
    int a; 
}; 

struct B 
{ 
    operator A() 
    { 
     return 10; 
    } 
}; 

int main() 
{ 
    B b; 
    cout << ((A)b).a << endl; 
    return 0; 
} 

該代碼在visual studio中編譯和打印10。但在接下來的wikipedia投運營商,我發現這句話:Note: for user-defined conversions, the return type implicitly and一定​​類型轉換運算符的具體事情

現在怎麼上述工程的代碼?視覺工作室的這個特點是什麼?或者它只是隱含地匹配?

回答

6

operator A()是用戶定義的轉換運算符。當您將B轉換爲A時,它的作用是按值返回A

您的operator A()函數返回一個字面整數值10。但operator A需要返回A,所以A的轉換構造函數被調用值10。這導致暫時構建A。然後您訪問此臨時對象上的.a,並將值.a插入到流中,這會導致您在屏幕上看到10

編輯

當維基說,converstion操作「含蓄」返回A,這意味着你不必指定函數declarion返回類型。它總是一個A,你無能爲力。

當維基說,它「隨意」返回A這意味着它不能返回任何東西,除了A。它甚至不能返回任何可兌換爲A的東西。它必須準確返回一個A

+0

這不是我要問的。我的問題是「如果演員操作符的返回類型的名稱應該隱式地或必然地(在我看來與顯式相同)匹配操作符的名稱?」 – 2011-04-29 21:19:55

+0

編輯完成後,一切都很清晰。謝謝! – 2011-04-29 21:21:55

1

B::operator A()隱式返回A。因此return 10隱含等於return (A)10return A(10)

+0

** **必需**?這是錯字還是我理解它的意思不正確? – 2011-04-29 21:14:26

+0

@Mihran:這意味着有必要通過定義一個轉換重載來使返回類型與操作符名稱匹配。 – 2011-04-29 21:17:15

相關問題