Если вы выделите объект с помощью 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, кажется, говорит о компиляторе, продлевающем время жизни объекта, на который указывает ссылка. Сама ссылка, опять же, просто указатель.