2026-08-27
ticker_bug.cpp
#include <iostream>
struct Ticker {
int count = 0;
Ticker operator++(int) {
++count;
return *this;
}
};
int main() {
Ticker t;
Ticker old = t++;
std::cout << old.count << " " << t.count << "\n";
}
old.countは0になるはずですが、実際には1になってしまいます。operator++(int)の何が問題で、どう直せばよいでしょうか?
Answer
この実装はcountを先にインクリメントしてから*thisを返しているため、後置演算子が返すのは呼び出し後の状態になってしまい、前置演算子と見分けがつかなくなっています。後置演算子は本来、インクリメントする前の状態のコピーを返す必要があります。最小限の修正は、書き換える前にコピーを取っておくことです:
Ticker operator++(int) {
Ticker old = *this;
++count;
return old;
}