在C ++中显式调用原始运算符函数

时间:2010-10-30 23:43:35

标签: c++ function operator-keyword

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)?
  • 如果是,怎么样?
  • 如果没有,是否有一个C ++参考词汇表明这是不可行的?

2 个答案:

答案 0 :(得分:8)

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

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

  

候选操作员的功能   代表内置运算符   第5条中定义的内容在   这个子条款。这些候选人   功能参与运营商   超载解决过程为   在13.3.1.2 中描述并使用   没有其他目的

答案 1 :(得分:2)

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

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

  

不,C ++语言需要这样   您的操作员重载至少需要   “类型”的一个操作数或   枚举类型。 C ++语言   不会让你定义一个运算符   所有的操作数/参数都是   原始类型。

     

例如,您无法定义   operator ==需要两个char *和   使用字符串比较。非常好   新闻,因为如果s1和s2是类型   char *,表达式s1 == s2已经存在   有一个明确的含义:它   比较两个指针,而不是两个指针   这些指针指向的字符串。   你不应该使用指针。使用   std :: string而不是char *。

     

如果C ++允许你重新定义其含义   内置类型的运算符,你   我不会知道1 + 1是什么:它   将取决于哪些标题得到   包括和是否其中之一   标题重新定义除了意思,   例如,减法。

C ++标准§13.5.6

  

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