返回void的预增量操作符

pre increment operator that returns void

本文关键字:操作符 void 返回      更新时间:2023-10-16

以下代码在gccclang中都可以编译:

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

不"正确"实现这种操作符的方法是:

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

void版本是黑客吗?我从来没见过这样的语法。谷歌搜索只返回一篇关于它的IBM教育论文。

为什么这不是广泛使用的方式来实现预增量返回self引用

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

如果你问为什么它是预增量没有这个签名,而不是返回一个左值引用到它所应用的对象,这是因为它被设计为求值到一个表达式,这样它就可以以与内置类型相同的方式使用:

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

此外,前缀++(和--)的预期语义是它们返回对(修改过的)对象的左值引用。

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

人们希望能够写

A a;
B b = ++a;

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