Если вы хотите, чтобы ++
вел себя так же, как и для встроенных типов, то:
- preincrement (
++t
) должен увеличиваться, а затем возвращать новое значение (которое может быть возвращено по ссылке);
- postincrement (
t++
) должен скопировать исходное значение и вернуть его после увеличения.
Ваш постинкремент смешивает оба; он увеличивает, а затем возвращает копию нового значения (то есть действует как преинкремент, но с ненужной копией). Вы видите дополнительный вызов деструктора, когда эта временная копия уничтожается в конце полного выражения, в котором она была создана.
Более каноническая реализация будет выглядеть так:
test & operator++() {
++a;
return *this;
}
test operator++(int) {
test copy = *this;
++a;
return copy;
}