Каково время жизни члена данных класса, который является ссылкой на значение? - PullRequest
4 голосов
/ 16 июля 2011

Обычно это обсуждение относится только к локальной переменной функции:

void foo (const int &i)
{
  // use i till foo() ends
}
foo(3);

Но относится ли это правило и к class члену?

struct A {
  const int &a;
  A () : a(3) {}  // version 1
  A (const int &i) : a(i) {} // version 2
};

Теперь A используется как

{
  return ()? new A : new A(3) : new A(some_local_variable);
}

Будет ли содержимое a оставаться неизменным в течение срока службы всех 3 new выделенных A?

Ответы [ 2 ]

3 голосов
/ 16 июля 2011

Стандарт C ++ 03 ( Раздел «12.2 / 5 Временные объекты» ) удачно отвечает на ваш вопрос:

Временное, к которому привязана ссылка, или временноеэто полный объект для подобъекта, с которым связан временный объект, сохраняется в течение всего срока действия ссылки, кроме случаев, указанных ниже. Временная привязка к элементу ссылки в ctor-initializer конструктора (12.6.2) сохраняется до выхода из конструктора.Временная граница с опорным параметром в вызове функции (5.2.2) сохраняется до завершения полного выражения, содержащего вызов. * +1007 *

2 голосов
/ 16 июля 2011

Если вы выделите объект с помощью new, он останется в памяти навсегда - до тех пор, пока вы не delete его. Это не временный объект.

a является членом A и как таковая является частью распределения.

РЕДАКТИРОВАТЬ: Спасибо за комментарии. Я бы сказал - нет, это не правильно. Учтите это:

struct A {
  const int &a;
  A () : a(3) {}  // version 1
  A (const int &i) : a(i) {} // version 2
};

void foo() {
  A *pA;

  {
     int x;
     pA = new A(x);
  }

  // Now pA->a is pointing to the address where `x` used to be,
  // but the compiler may very well put something else in this place now
  // because x is out of scope.
}

Ответ более очевиден, если время жизни объекта A охватывает несколько функций.

Примечание: я нахожу здесь слово "содержание" несколько двусмысленным. Приравнивайте ссылку с указателем, чтобы ваш a в основном указывал на целое число. const или нет, если целое число больше не существует (потому что оно было в стеке и было удалено), ваш a - все еще указывая на тот же адрес в памяти - теперь ссылается на что-то еще. Статья GotW, кажется, говорит о компиляторе, продлевающем время жизни объекта, на который указывает ссылка. Сама ссылка, опять же, просто указатель.

...