инициализация значения константной ссылки на член - PullRequest
6 голосов
/ 10 ноября 2010

Я смотрю код следующей формы:

class foo
{
  public:
    foo() {}

  //...
};

class bar
{
  public:
    bar() : ref() {}

  private:
    const foo &ref;
};

Правильна ли инициализация ссылки с использованием временного таким образом?Я знаю, что можно инициализировать константную ссылку, которая является локальной переменной, с временной, и это продлевает время жизни временной переменной, например,

const foo &tmp = funcThatReturnsByValue(); //OK

Однако один из ответов на связанный инициализация ссылки в списке инициализации предполагает, что существует разница между «недолговечными» и «долгоживущими» ссылками, и что инициализация ref, как указано выше, является неопределенным поведением (даже если ref является const ссылка).

12.2.5 в стандарте частично говорит: «Временная привязка к элементу ссылки в ctor-initializer конструктора сохраняется до выхода из конструктора».Описывает ли это ситуацию?

Ответы [ 3 ]

4 голосов
/ 10 ноября 2010

Этот код не сформирован. Вы не можете по умолчанию инициализировать или значение инициализировать ссылку.

Если у вас действительно есть выражение внутри ref(), тогда да, 12.2.5 будет применяться и временное будет уничтожено при выходе из конструктора.

2 голосов
/ 11 ноября 2010

Ваш пример не создает временный - для этого вам нужно изменить на:

    bar() : ref(foo()) {} 

Теперь вы привязываете ссылку к временному объекту, и этот временный объект будет уничтожен в конце конструктора. Ваша ссылка будет недействительной, и это нехорошо.

1 голос
/ 10 ноября 2010

Я думаю, что вы хотите сделать:

bar() : ref(foo()) {}

, но не думайте, что время жизни временного представителя продлевается до тех пор, пока на него не появится ссылка. Нет, на самом деле это не так. Таким образом, независимо от того, постоянное это или нет, вы должны инициализировать ссылку обычным объектом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...