В С++ время жизни временного значения может быть расширено путем привязки его к ссылке:
Foo make_foo();
{
Foo const & r1 = make_foo();
Foo && r2 = make_foo();
// ...
} // both objects are destroyed here
Почему это разрешено? Какую проблему это решить?
Я не мог найти объяснения этому в Design and Evolution (например, 6.3.2: Lifetime of Temporaries). Я также не мог найти какие-либо предыдущие вопросы об этом (этот был ближе всего).
Эта функция несколько неинтуитивная и имеет тонкие режимы отказа. Например:
Foo const & id(Foo const & x) { return x; } // looks like a fine function...
Foo const & r3 = id(make_foo()); // ... but causes a terrible error!
Почему что-то, что может быть так легко и тихо злоупотреблять частью языка?
Обновление: точка может быть достаточно тонкой, чтобы оправдать некоторые пояснения: я не оспариваю использование правила, которое "привязывает ссылки к временным". Это хорошо и хорошо, и позволяет нам использовать неявные con & shy; ver & shy; sions при привязке к ссылкам. То, о чем я прошу, - это то, почему пострадало время жизни. Чтобы играть адвоката дьявола, я мог бы утверждать, что существующие правила "времени жизни до конца полного выражения" уже охватывают общие случаи использования функций с временными аргументами.