繁体   English   中英

在C ++中为一个操作数重载二进制运算符

[英]Overloading a binary operator for one operand in c++

您可以在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 ++标准允许的一个操作数重载二进制运算符? 如果是这样,是否有可能通过使用运算符为右操作数使用某种虚拟值来调用重载函数?

另外,不用担心,我不打算在任何实际代码中使用它,我很好奇,因为我找不到任何有关此的东西。

您不是在重载二元运算符,而是unary +运算符。 正确的用法是

IntWrap test;
test = 0;
+test;

您可以在C ++中重载二元运算符以仅接受一个操作数吗?

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

你做了什么

IntWrap operator+() { ... }

是重载一元+运算符。

您应该可以使用:

IntWrap test;
test = 0;
+test;

N4140 [over.oper] / 6:

不能更改运算符的优先级,分组或操作数数量

在代码中,您重载了一元+运算符,而不是二元运算符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM