1

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

struct Stuff {};

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

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

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使用函数符号来编写+,或者我是否必须坚持中缀-+作为模板中的规则。

4

1 回答 1

1

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

从逻辑上讲,人们可能期望能够使用语法调用这些函数operator+,因为编译器确实在重载决议中考虑它们,就好像它们作为函数存在一样。但是 §13.6 清楚地表明它们仅用于重载决议,而不是在任何其他情况下。

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

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

于 2013-08-28T08:32:32.857 回答