Я смотрю на коде следующего вида:значения инициализация константного элемента ссылка
class foo
{
public:
foo() {}
//...
};
class bar
{
public:
bar() : ref() {}
private:
const foo &ref;
};
инициализирует ссылку, используя временную, таким образом, правильно? Я знаю, что можно инициализировать ссылку на const, которая является локальной переменной с временным, и что это увеличивает время жизни временного, например.
const foo &tmp = funcThatReturnsByValue(); //OK
Однако один из ответов на соответствующие initialize reference in initialization list предполагает, что существует разница между «короткоживущим» и «долгоживущим» ссылкой, и что при инициализации ref
как указано выше, является неопределенным поведением (хотя и ref
является ссылкой const
).
12.2.5 в стандарте, в частности, говорится: «Временная привязка к ссылочному элементу в конструкторе-инициализаторе конструктора сохраняется до тех пор, пока конструктор не выйдет». Это описывает эту ситуацию?
Не могли бы вы исправить свой код, чтобы на самом деле он был временным? –
ref() не связывает ref с временным экземпляром foo? Извините, если моя терминология неточна ... Я делаю все возможное, чтобы понять этот фрагмент кода. – user168715
Возможно, этот комментарий бесполезен (я не знаю контекста, который вы смотрите на этот код), но проблема исчезает, если 'ref' является указателем. Дело в том, что ссылки не могут быть инициализированы значением, но указатели могут (они получают нуль-инициализацию). Более того, большинство компиляторов (по крайней мере, MSVC) выдает предупреждение о невозможности создания оператора присваивания по умолчанию. В качестве ориентира, когда вы хотите использовать элемент ссылки, вы хотите, чтобы на самом деле указатель ... –