首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以使用函数表示法operator#()来调用内置类型的运算符吗?

我可以使用函数表示法operator#()来调用内置类型的运算符吗?
EN

Stack Overflow用户
提问于 2013-08-28 08:28:35
回答 1查看 605关注 0票数 1

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

代码语言:javascript
复制
struct Stuff {};

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

然后,我可以使用infix类,但仍然可以通过函数表示法来解决它。所以这很好:

代码语言:javascript
复制
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) (如果我可以这样引用),而不是在infix符号中?。

当我尝试

代码语言:javascript
复制
int aa = 12;
int bb = operator+(a, 6);    // err
int cc = ::operator+(a, 6);  // err

我会收到诸如"operator+未定义“之类的错误。我是错误地处理了函数,还是不可能对内置的函数进行处理?

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

代码语言:javascript
复制
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编写+,或者我是否必须将infix-+作为模板中的一项规则。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-28 08:32:32

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

从逻辑上讲,人们可能期望能够使用operator+语法调用这些函数,因为编译器确实将它们视为重载解析,就像它们作为函数存在一样。但§13.6明确指出,它们只用于过载解决,而不是在任何其他情况下使用。

13.6.(1) 内置运算符 over.built 代表第5款中定义的内建运算符的候选运算符函数在本款中指定。这些候选函数参与13.3.1.2中描述的操作符过载解析过程,并且不用于其他目的。..。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18482906

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档