返回void的预增量运算符

时间:2015-10-06 06:45:10

标签: c++ pre-increment

以下内容在gccclang中编译正常:

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

不能“纠正”实现这种运算符的方式是:

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

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

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

2 个答案:

答案 0 :(得分:6)

  

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

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

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

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

答案 1 :(得分:1)

你当然可以这样写,它会做你想要的。但是设计的一般原则是,重载运算符应该以类似于' int'会避免让用户感到惊讶。

人们希望能够写出

A a;
B b = ++a;

因为预增量通常是如何工作的,并且会因为编译器错误而感到惊讶,这会给你的课程带来好处。没有技术上的理由说明为什么你不能让它做出不同的事情,就像你真正想要的那样你可以为你的班级做算子+做减法。