Namaran

Code daily. Without assist.

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.count0になるはずですが、実際には1になってしまいます。operator++(int)の何が問題で、どう直せばよいでしょうか?

Answer

この実装はcountを先にインクリメントしてから*thisを返しているため、後置演算子が返すのは呼び出し後の状態になってしまい、前置演算子と見分けがつかなくなっています。後置演算子は本来、インクリメントする前の状態のコピーを返す必要があります。最小限の修正は、書き換える前にコピーを取っておくことです:

Ticker operator++(int) {
    Ticker old = *this;
    ++count;
    return old;
}