c++中为一个操作数重载二进制操作符

Overloading a binary operator for one operand in c++

本文关键字:操作数 一个 重载 二进制 操作符 c++      更新时间:2023-10-16

能否在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++标准允许的吗?如果是这样,是否有可能使用操作符表示法调用重载函数,可能是通过对右操作数使用某种虚拟值?

另外,别担心,我不打算在任何实际代码中使用这个,我只是好奇,因为我找不到关于这个的任何东西

在c++中能否重载一个二元操作符,使其只接受一个操作数?

不,你不能那样做。操作符重载不允许更改语言的语法或操作符优先级。它只允许您更改使用操作符时发生的情况。

你用

做了什么
IntWrap operator+() { ... }

重载一元+操作符

你应该能够使用:

IntWrap test;
test = 0;
+test;

您重载的不是二进制操作符,而是unary +操作符。正确的用法是

IntWrap test;
test = 0;
+test;

N4140 [over.oper]/6:

不能更改操作符的优先级、分组、操作数的数目。

在你的代码中,你重载了一元+运算符,而不是二进制的。