Есть вот такой класс и вот такая ф-я:
class A{
...
A& self(){ return *this; }
void close();
~A(){ close(); }
};
...
void f(A&);
f(A());
A a;
f(a);
a.close();
f( A().self() );
Насколько мне помнится, вар. 1 запрещен стандартом как одна из защит от дурака (типа при передаче временного объекта по не-константной ссылке он может быть изменен а потом изменения могут быть потеряны). Тем не менее такая необходимость встречается, например сформировали поток, функция в него отписалсь, поток закрылся. В C++0x для таких вещей даже расширили синтаксис.
Сравним вар 2 и вар. 3. Вар 3 во первых втрое лаконичней, во вторых если в вар. 2 забыть a.close(), то потом в рантайме могут вылезти неприятные и весьма трудноуловимые ошибки. Опять таки, насколько мне помнится временный объект будет жить пока не завершится вызов f, поэтому ИМНО вар 3 вполне безопасен.
Очень хотелось бы услышать аргументированное мнение специалистов насколько вар 3 корректен. Под аргументированным я понимаю объяснение того, ПОЧЕМУ так делать нельзя и КОГДА так делать нельзя (конкретные примеры ошибок к которым может приводить вар 3, или например описание гипотетических ситуаций когда временный объект не доживет до окончания вызова f). Заявления типа «так делать нельзя потому, что так делать нельзя никогда» аргументированными не считаются;-)