НМВ>НМВ> //postfix ++
НМВ> const foo operator++(int)
НМВ> {
НМВ> deferred_increment inc(*this);
НМВ> return *this;
НМВ> // увеличили *this в деструкторе
НМВ> // ни одной временной переменной не надо
НМВ> }
НМВ>};
НМВ>
НМВ>Если так можно (т.е. безопасно) делать, то почему так никто не делает?
А зачем? В чем собственно заключается оптимизация? deferred_increment имеет размер sizeof(master_type&). Т.е. тот же временный объект создаваемый на стеке.
НМВ>Ещё брутальнее: безопасный по исключениям stack::pop(), возвращающий значение
НМВ>НМВ> value_type vpop()
НМВ> {
НМВ> deferred_pop p(*this)
НМВ> return top();
НМВ> // вызов деструктора p
НМВ> }
НМВ> /*...*/
НМВ> };
НМВ>
А в чем суть этого кода? Насколько я понимаю top() не бросает исключений, он и так безопасен. А в деструкторе deferred_pop вызывается pop(), который может бросить исключение и нигде в деструкторе они не обрабатываются!