你能否重载一个二元运算符,只能在C ++中只取一个操作数?
我尝试用类似这样的类来实现它:
#include <iostream>
using namespace std;
class IntWrap {
public:
IntWrap operator=(int rhs) {
val = rhs;
return *this;
}
// No second operand for +
IntWrap operator+() {
IntWrap result;
result = val + 1;
return result;
}
int Val() {return val;}
private:
int val;
};
这段代码实际上是用GCC编译的,这让我感到惊讶,它甚至没有给-Wall
发出任何警告
我遇到的问题实际上是使用重载运算符。
这不会编译,因为GCC期望+
之后的操作数:
int main() {
IntWrap test;
test = 0;
test +; // GCC expects an operand after +
return 0;
}
成员函数可以与test.operator+()
一起使用,但实际上并不使用运算符。
更具体地说,是否只使用C ++标准允许的一个操作数重载二元运算符?如果是这样,是否可以使用运算符表示法调用重载函数,可能是通过对右侧操作数使用某种虚拟值?
另外,不用担心,我不打算在任何实际代码中使用它,我只是好奇,因为我找不到任何关于此的内容。
答案 0 :(得分:2)
您没有重载二元运算符,而是unary +
运算符。正确的用法是
IntWrap test;
test = 0;
+test;
答案 1 :(得分:2)
你能否重载一个二元运算符,只能在C ++中只取一个操作数?
不,你不能这样做。运算符重载不允许您更改语言的语法或运算符优先级。它只允许您更改使用运算符时发生的情况。
你做了什么
IntWrap operator+() { ... }
重载了一元+
运算符。
你应该可以使用:
IntWrap test;
test = 0;
+test;
答案 2 :(得分:0)
N4140 [over.oper] / 6:
无法更改运算符的优先级,分组,或操作数。
在您的代码中,您重载了一元+
运算符,而不是二进制运算符。