我可以使用函数符号运算符#()来调用内置类型的运算符吗?

时间:2013-08-28 08:28:36

标签: c++ function operators operator-overloading

当我定义自己的数据类型时,我也可以通过全局重载相应的operator函数来定义运算符:

struct Stuff {};

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

然后我可以使用它像infix一样,但仍然可以通过函数符号来解决它。所以这很好:

Stuff x;
Stuff y;
Stuff a = x+y;             // using infix-notation
Stuff b = operator+(x,y);  // using the function-notation

但是int(例如)已经 定义了+

有没有办法在函数表示法中调用int operator+(int,int)(如果我可以用这种方式引用它)而不是在中缀符号中?

当我尝试

int aa = 12;
int bb = operator+(a, 6);    // err
int cc = ::operator+(a, 6);  // err

我收到“运营商+未定义”等错误。 我是否错误地解决了这个功能,或者这对于内置插件是不可能的?

奖金:如果我写一个模板,我会对不同的类型参数有不同的行为,那么:

template<typename T>
T add_op(T a, T b) { return a+b; }

template<typename T>
T add_fun(T a, T b) { return operator+(a,b); } // failing for int

int main() {
    int am = add_op(3, 4);                 // ok
    int bm = add_fun(3, 4);                // fail
    Stuff um = add_op(Stuff{}, Stuff{});   // ok
    Stuff vm = add_fun(Stuff{}, Stuff{});  // ok
}

这看起来很奇怪,我想知道是否有办法使用add_fun的函数符号来编写+,或者如果我必须坚持使用中缀 - +作为模板中的规则。

1 个答案:

答案 0 :(得分:2)

你甚至无法定义operator+( int, int );至少有一个 用户定义的运算符的操作数必须是用户定义的 type(类或枚举类型)。

逻辑上,人们可能希望能够调用这些 函数使用operator+语法,就像编译器一样 在重载分辨率中考虑它们,就好像它们一样存在 功能。但§13.6明确表示它们仅用于 重载决议,而不是任何其他上下文。

  

13.6。(1)内置运算符 [over.built]

     

本子条款中规定了表示第5章中定义的内置运算符的候选运算符函数。这些候选函数参与运算符重载解析过程,如13.3.1.2 中所述,并且不用于其他目的。 ......