value-инициализация ссылки на элемент const
Я смотрю на код следующего вида:
class foo
{
public:
foo() {}
//...
};
class bar
{
public:
bar() : ref() {}
private:
const foo &ref;
};
правильно ли инициализировать ссылку с помощью временного таким образом? Я знаю, что можно инициализировать ссылку const, которая является локальной переменной с временным, и что это продлевает время жизни временного, например
const foo &tmp = funcThatReturnsByValue(); //OK
однако, один из ответов на связанные инициализировать ссылку в списке инициализации предполагает, что существует разница между "недолговечные "и" долгоживущие " ссылки, и это инициализация ref
как указано выше, неопределенное поведение (хотя ref
это const
ссылка).
12.2.5 в стандарте, в частности, говорится: "временная привязка к ссылочному члену в ctor-инициализаторе конструктора сохраняется до тех пор, пока конструктор не завершит работу.- Это описывает ситуацию?
3 ответов
этот код является некорректным. Вы не можете инициализировать ссылку по умолчанию или инициализировать значение.
Если у вас действительно было выражение внутри ref()
, тогда да, 12.2.5 будет применяться, и временное будет уничтожено при выходе конструктора.
ваш пример не создает временный - для этого нужно изменить на:
bar() : ref(foo()) {}
теперь вы привязываете ссылку к временному, и этот временный объект будет уничтожен в конце конструктора. Ваша ссылка будет недействительной, и это нехорошо.
Я думаю, что вы хотите сделать, это:
bar() : ref(foo()) {}
но не наивно думать, что время жизни временного продлевается, пока нет ссылки на него. Нет, на самом деле нет. Таким образом, независимо от const или нет, вы должны инициализировать ссылку с обычным объектом.