2013-10-10 133 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++函数调用一样对待它。正确? –

相关问题