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 или нет, вы должны инициализировать ссылку с обычным объектом.