7
int a, b, c; 

//do stuff. For e.g., cin >> b >> c; 

c = a + b;          //works 
c = operator+(a,b); //fails to compile, 'operator+' not defined. 

另一方面,这有效 -

class Foo
{
 int x; 
public:
 Foo(int x):x(x) {} 

 Foo friend operator+(const Foo& f, const Foo& g)
 {
  return Foo(f.x + g.x); 
 }

};    

Foo l(5), m(10); 

Foo n = operator+(l,m); //compiles ok! 
  • 甚至可以直接调用原始类型(如 int)的 operator+(和其他运算符)吗?
  • 如果是,如何?
  • 如果没有,是否有 C++ 参考措辞明确表明这是不可行的?
4

2 回答 2

8

首先,将内置运算符作为函数调用是行不通的,因为语言规范从未说过这样的函数存在。内置运算符只是运算符。它们背后没有实现功能,仅仅是因为语言规范从未暗示它们的存在。基于函数的实现仅特定于重载运算符。

其次,在重载决议期间,内置运算符确实由它们虚构的类似函数的对应物表示,但是禁止“显式”类似函数调用内置运算符的措辞出现在 13.6/1

代表第 5 节中定义的内置运算符的候选运算符函数在本节中指定。这些候选函数参与 13.3.1.2 中描述的运算符重载决策过程,并且不用于其他目的

于 2010-10-31T00:13:48.407 回答
2

来自http://www.parashift.com/c++-faq-lite/intrinsic-types.html

我可以定义一个适用于内置/内在/原始类型的运算符重载吗?

不,C++ 语言要求您的运算符重载至少采用一个“类类型”或枚举类型的操作数。C++ 语言不允许您定义所有操作数/参数都是原始类型的运算符。

例如,您不能定义接受两个 char*s 并使用字符串比较的 operator==。这是个好消息,因为如果 s1 和 s2 是 char* 类型,则表达式 s1 == s2 已经具有明确定义的含义:它比较两个指针,而不是这些指针指向的两个字符串。无论如何,您都不应该使用指针。使用 std::string 代替 char*。

如果 C++ 让您重新定义内置类型上的运算符的含义,您将永远不会知道 1 + 1 是什么:它取决于包含哪些标头以及这些标头之一是否重新定义了加法,例如减法.

C++ 标准§13.5.6

操作符函数要么是非静态成员函数,要么是非成员函数,并且至少有一个类型为类、类引用、枚举或枚举引用的参数。不能更改运算符的优先级、分组或操作数的数量。为每种类型预定义的运算符 =、(一元)& 和 ,(逗号)的含义可以通过定义实现这些运算符的运算符函数来针对特定的类和枚举类型进行更改。运算符函数的继承方式与其他基类函数相同。

于 2010-10-30T23:53:10.463 回答