2015-10-06 90 views
1

预先递增运算符下面是两个gccclang编译OK:返回void

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

不 “正确” 的方式来实现这种操作的是:

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

void版本是黑客?我从来没有见过这样的语法。 Google搜索仅返回一篇有关IBM的教育论文。

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

+2

你所要求的不是很清楚,但是如果你试图在需要左值的表达式中使用它,你会下注一个错误。我认为标准中没有什么要求您正确实施。 – juanchopanza

+0

我会编辑问题 – Nick

+0

@juanchopanza:“如果你尝试使用它”:怎么样? –

回答

6

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

如果你问为什么它是预增量不具备这个签名,而不是返回一个左值引用它应用的对象,这是因为它的目的是评估一个表达式,使得它可以以相同的方式被使用,因为它是内置类型:

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

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

1

你当然可以这样写,它会做你想做的。但是,设计的一般原则是重载操作员应该以类似于'int'的方式工作,以避免惊讶的用户。

人们会希望能写

A a; 
B b = ++a; 

因为那是如何预增量通常工作,并会由编译器错误,这将与你的班出惊讶。没有什么技术上的原因可以使你不能做出不同的事情,就像你真的想要为你的班级做算子+减法一样。