returns 无效的预递增运算符

pre increment operator that returns void

以下在 gccclang 中都编译正常:

class A{
public:
    void operator++(){
        printf("A++\n");
    //  return *this;
    }
};

"correct"实现这种运算符的方法不是:

class A{
public:
    A &operator++(){
        printf("A++\n");
        return *this;
    }
};

void 版本是破解版吗?我从未见过这样的语法。 Google 搜索 returns 只有一篇关于它的教育 IBM 论文。

为什么这不是针对返回自引用实现预增量的广泛使用方式。

Why this is not wide used way to implement pre-increments against returning self reference.

如果你问为什么它是预增量没有这个签名,而不是 return 对它所应用的对象的左值引用,这是因为它旨在评估到一个表达式,这样它就可以像用于内置类型一样使用:

int i = 42;
int j = ++i;
A a;
A b = ++a;           // Error if RHS is void
(++a).doSomething(); // ditto

此外,前缀 ++(和 --)的预期语义是它们 return 对(修改的)对象的左值引用。做任何不同的事情总会导致混乱。

你当然可以这样写,它会如你所愿。但是有一个通用的设计原则,即重载运算符的工作方式应与 'int' 的工作方式类似,以避免让用户感到惊讶。

人们希望能够写作

A a;
B b = ++a;

因为这就是预增量通常的工作方式,并且会对您的 class 给出的编译器错误感到惊讶。没有技术原因可以说明为什么你不能让它做一些不同的事情,就像你可以让 operator + 为你的 class 做减法一样,如果你真的想要的话。