В 12.2 стандарта C ++ 11:
Временный объект, к которому привязана ссылка, или временный объект, являющийся полным объектом подобъекта, к которому привязана ссылка, сохраняется в течение всего времени существования ссылки, за исключением:
Временная привязка к ссылочному элементу в ctor-initializer конструктора (12.6.2) сохраняется до выхода из конструктора.
Временная привязка к параметру ссылки в вызове функции (5.2.2) сохраняется до завершения полного выражения, содержащего вызов.
Время жизни временной привязки к возвращаемому значению в операторе возврата функции (6.6.3) не продлевается; временное уничтожается в конце полного выражения в операторе возврата.
Временная привязка к ссылке в новом инициализаторе (5.3.4) сохраняется до завершения полного выражения, содержащего новый инициализатор.
И в стандарте есть пример последнего случая:
struct S {
int mi;
const std::pair<int,int>& mp;
};
S a { 1,{2,3} }; // No problem.
S* p = new S{ 1, {2,3} }; // Creates dangling reference
Для меня 2. and 3.
имеет смысл, и с этим легко согласиться. Но в чем причина 1. and 4.
? Мне этот пример кажется просто злым.
S a{ 1,{2,3} };
не вызывает проблем. Он даже не компилируется на моем компьютере (Mac OS 10.8 с Xcode 5) - person Kevin MOLCARD   schedule 21.02.2014