2013-10-10 180 views
0

考慮下面的程序:(A,B)

#include<functional> 

typedef std::function< int(int) > F; 

F operator+(F, F) 
{ 
    return F(); 
} 

int f(int x) { return x; } 

int main() 
{ 
    operator+(f,f); // ok 
    f+f; // error: invalid operands to binary expression 
} 

爲什麼最後一行f+f;不能編譯?爲什麼與operator+(f,f);不一樣?對此標準的參考將不勝感激。

+1

可能的重複http://stackoverflow.com/questions/13869150/rules-for-lookup-of-operators-in-c11? – Cubbi

+0

@Cubbi我不認爲這是重複的,它是關於*重載*成員和塊作用域操作符。 –

+0

那麼這個答案提出了查找規則(對於'a + b'和'operator +(a,b)'來說這是相當不同的),所以它會回答你的問題的標題。但是,在這種情況下,標準中有一個捷徑。 – Cubbi

回答

2

f的類型是內置類型。對內置類型的對象的操作從不考慮用戶定義的操作符。調用operator+(f, f)明確強制進行兩次轉換,除非強制轉換,否則不會發生這種轉換。相關條款是13.3.1.2 [over.match.oper]第1段:

如果表達式中操作符的操作數沒有類型或枚舉類型,則假定操作符是內置的運營商和根據條款5解釋。...

+0

謝謝!我認爲這也解釋了*爲什麼*:與C的兼容性。像'f + f'這樣的C有效表達式應該得到相同的結果。類似於'operator +(f,f)'的東西在C中不存在,因此可以像C++函數調用一樣對待它。正確? –

相關問題