【问题标题】:Difference between a+b and operator+(a,b)a+b 和 operator+(a,b) 的区别
【发布时间】:2013-10-10 22:53:31
【问题描述】:

考虑以下程序:

#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);不一样?参考标准将不胜感激。

【问题讨论】:

  • @Cubbi 我不认为这是重复的,它是关于 重载 成员和块范围运算符。
  • 这个答案提出了查找规则(a+b 与 operator+(a,b) 完全不同),所以它会回答你的问题的标题.. 但是是的,在这种情况下,标准中有一条捷径。

标签: c++ operator-overloading language-lawyer


【解决方案1】:

f 的类型是内置类型。对内置类型对象的操作从不考虑用户定义的操作符。调用operator+(f, f) 显式地强制进行两次转换,除非它们被强制,否则这些转换不会发生。相关条款是 13.3.1.2 [over.match.oper] 第 1 段:

如果表达式中没有运算符的操作数具有类或枚举类型,则假定该运算符是内置运算符并根据第 5 条进行解释。 ...

【讨论】:

  • 谢谢!我认为这也解释了为什么:与 C 的兼容性。来自 C 的有效表达式(如 f+f)应该产生相同的结果。 C 中不存在 operator+(f,f) 之类的东西,因此可以将其视为 C++ 函数调用。对吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-27
  • 2012-07-03
  • 1970-01-01
  • 1970-01-01
  • 2016-05-04
  • 2012-06-26
相关资源
最近更新 更多