当我定义自己的数据类型时,我也可以通过全局重载相应的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
的函数符号来编写+
,或者如果我必须坚持使用中缀 - +
作为模板中的规则。
答案 0 :(得分:2)
你甚至无法定义operator+( int, int )
;至少有一个
用户定义的运算符的操作数必须是用户定义的
type(类或枚举类型)。
逻辑上,人们可能希望能够调用这些
函数使用operator+
语法,就像编译器一样
在重载分辨率中考虑它们,就好像它们一样存在
功能。但§13.6明确表示它们仅用于
重载决议,而不是任何其他上下文。
13.6。(1)内置运算符 [over.built]
本子条款中规定了表示第5章中定义的内置运算符的候选运算符函数。这些候选函数参与运算符重载解析过程,如13.3.1.2 中所述,并且不用于其他目的。 ......