gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:49:05 26 4
gpt4 key购买 nike

当我定义自己的数据类型时,我还可以通过重载适当的 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

我收到诸如“operator+ not defined”之类的错误。 我是不是错误地处理了这个函数,或者这对内置函数来说是不可能的?

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

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使用函数符号表示 + ,或者如果我必须坚持中缀- +作为模板中的规则。

最佳答案

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

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

13.6.(1) Built-in operators [over.built]

The candidate operator functions that represent the built-in operators defined in Clause 5 are specified in this subclause. These candidate functions participate in the operator overload resolution process as described in 13.3.1.2 and are used for no other purpose. ...

关于c++ - 我可以使用函数符号 operator#() 来调用内置类型的运算符吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18482906/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com