【问题标题】:Does C++ compiler treat all postfix operator overloading as same (postfix version of - and --)?C++ 编译器是否将所有后缀运算符重载视为相同(- 和 -- 的后缀版本)?
【发布时间】:2020-08-08 16:40:48
【问题描述】:
#include <cstdio>
#include <iostream>
using namespace std;

class Int32 {
    int num;
public:
    Int32(int num = 0) : num(num) {}
    ~Int32() {}
    int value() { return num; }
    Int32 & operator - (int x) { cout << "Postfix of -" << endl; return *this; }
    Int32 & operator -- (int x) { cout << "Postfix of --" << endl; return *this; }
};

int main() {
    Int32 x(100);
    x--;
    x-;  // [Error] expected primary-expression before ';' token
    x.operator-(0);
    return 0;
}

从上面的代码中,我重载了 postfix incrementpostfix unary minus。我知道 postfix unary minus 没有意义,但我想知道为什么我对 x- 有编译错误,而 x-- 没有任何问题x.operator-(0) 操作。

我在 DevC++ 中编译了这段代码,但出现以下错误。

[Error] expected primary-expression before ';' token

x- 有什么问题?

【问题讨论】:

  • x- 不存在。你在哪里使用这个运算符?只有一元减号。
  • @Sanjeev:他的意思是编译器让他声明一个作为后缀一元减号运算符的函数,他甚至可以调用它,但他不能使用运算符语法。
  • 解析独立于重载决议。 x-; 失败,因为语言语法不允许。
  • 您可以定义函数,因为您可以使用x.operator-() 语法调用它。
  • 这不是“一元后缀- 运算符”,而是“二进制中缀- 运算符”。

标签: c++ operator-overloading unary-operator postfix-operator


【解决方案1】:

x- 有什么问题?

没有错;这是由语言设计的。您将看到与

相同的错误
1 - ;

意思是,operator - 期望一个参数可以像你在下一行中那样使用

x.operator-(0);

【讨论】:

  • x--; 也期待一个参数,并且隐式零已通过。我对x-; 也有同样的期待。正如@Barmer 所说,解析是独立于重载解析完成的。不代表我可以使用任何运算符语法来调用Int32 &amp; operator - (int x)
  • @vinothkumar 那是给x - 0(或任何Int32{} - int{}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-05
  • 2020-01-14
  • 2013-07-27
  • 2016-03-29
  • 1970-01-01
相关资源
最近更新 更多