2013-12-14 51 views
0

我正在爲一個基本類型編寫一個簡單的包裝,並且試圖避免編寫太多標準運算符。我希望隱式類型轉換會有所幫助,但事實並非如此。這裏有一個簡化的例子:用二元運算符C++隱式轉換

struct Int 
{ 
    int _i; 
    Int(int i=0) :_i{i} {} 
    Int operator+ (const Int& rhs) {return _i+rhs._i;} 
}; 

int main(int argc, char *argv[]) 
{ 
    (void)(Int(1) + 2); // Fine 
    (void)(2 + Int(1)); // error: invalid operands to binary expression ('int' and 'Int') 
} 

我正在使用llvm。主編的第一行很好。第二個導致錯誤。現在,我希望在第二行發生的是2會隱式轉換爲Int(2),然後調用operator +。爲什麼沒有發生?爲什麼隱式轉換髮生在第一行?

+0

看的boost ::經營者避免這樣的問題,它有助於去除樣板書面運營商的情況。 – polkadotcadaver

+0

@艾略特羅賓遜,謝謝。這有我正在尋找的解釋。我希望能在某些時候在C++規範中找到它。 – user3101366

回答

2

它發生在第一行,因爲唯一可用的operator+operator+(Int&)(其具有對於this實例的Int的隱式第一參數)。第二行失敗,因爲第一個參數是int,它不知道它需要在嘗試操作之前將其轉換(它不知道它需要使用Int::operator+)。

您可以通過操作一個非成員友元函數(http://ideone.com/YCf7wX

struct Int 
{ 
    int _i; 
    Int(int i=0) :_i{i} {} 
    friend Int operator+(const Int& lhs, const Int& rhs); 
}; 

Int operator+(const Int& lhs, const Int& rhs) 
{ 
    return lhs._i+rhs._i; 
} 

int main() 
{ 
    Int i; 
    i + 5; 
    5 + i; 
    return 0; 
}