C++ 为什么要在预增量方面实施后增量?

C++ 为什么要在预增量方面实施后增量?,c++,increment,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 } 根据准则: 指南:为了保持一致性,请始终按照预

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
}
根据准则:

指南:为了保持一致性,请始终按照预增量实施后增量,否则您的用户会感到惊讶(以及 (通常是令人不快的)结果


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

这个问题有点哲学性。运算符的语义没有“绝对确定”的定义,但用户可能期望它们对参数具有相同的效果,但一个在效果之前返回参数,另一个在效果之后返回参数。然而,这可以通过建议的实现轻松实现。但是,偏离方法不会保证“不良影响”。

这确保了两个操作符在修改对象的方式上表现相同,并且只在返回值上有所不同。如果分别实现这两个操作符,并且决定修改其中一个,则可能会忘记对另一个进行等效更改。如果您在另一个方面实现了一个,那么您只需要在一个地方进行更改。而且,将预增量作为更基本的增量是有意义的,因为后增量的唯一区别是将旧值保存在临时的第一个值中


当他说你的用户会得到令人惊讶的结果时,他可能夸大了事实。他可能应该说可能会得到令人惊讶的结果,因为只有当你搞砸的时候才会发生。

我很肯定他只是说,在预增量方面实现后增量消除了意外实现两个逻辑不同的运算符的可能性,这会让用户非常困惑。假设您没有犯这样的错误,那么不会发生任何令人惊讶或不愉快的事情(尽管由于代码重复,它可能仍然是次优的)