为什么要在预增量方面实现后增量?

时间:2014-10-10 21:53:57

标签: c++ increment

Herb Sutter建议实施这样的后增量:

T T::operator++(int)() {
    auto old = *this; // remember our original value
    ++*this;          // always implement postincr in terms of preincr
    return old;       // return our original value
}

使用指南:

  

指南:为了保持一致性,始终在预先增量方面实施后增量,否则您的用户会感到惊讶(和   通常是不愉快的结果。

这些令人惊讶的(通常是令人不愉快的)结果是什么?

3 个答案:

答案 0 :(得分:3)

这确保了两个运算符在修改对象方面的行为等效,并且只返回它们的返回值。如果单独实现这两个运算符,并且决定修改其中一个运算符,则可能会忘记对另一个运算符进行等效更改。如果您根据另一个实现一个,您只需在一个地方进行更改。并且将preincrement作为更基本的一个是有意义的,因为后增量的唯一区别是首先保存旧值。

当他说你的用户会得到惊人的结果时,他可能会夸大其词。他可能应该说可能会得到令人惊讶的结果,因为只有在你陷入困境时它才会发生。

答案 1 :(得分:2)

我很确定他只是说在前增量方面实施后增量可以避免意外地使用不同逻辑实现两个运算符的可能性,这对用户来说会非常混乱。假设你没有犯这样的错误,就不会出现任何令人惊讶或不愉快的事情(尽管由于代码重复可能仍然不是最理想的)

答案 2 :(得分:1)

这个问题有点哲学。没有"绝对明确的"运算符语义的定义,但是用户可能期望它们对参数具有相同的效果,但是在效果之前返回参数,在效果之后返回另一个参数。然而,这可以通过所提出的实现容易地实现。没有"不良影响"但是,通过偏离方法可以保证。