Я написал следующий пример кода:
#include <iostream>
class B
{
int Value;
public:
B(int V) : Value(V) {}
int GetValue(void) const { return Value;}
};
class A
{
const B& b;
public:
A(const B &ObjectB) : b(ObjectB) {}
int GetValue(void) { return b.GetValue();}
};B b(5);
A a1(B(5));
A a2(b);
A a3(B(3));int main(void)
{
std::cout << a1.GetValue() << std::endl;
std::cout << a2.GetValue() << std::endl;
std::cout << a3.GetValue() << std::endl;
return 0;
}
Скомпилированный с mingw-g ++ и выполненный на Windows 7, я получаю
6829289
5
1875385008
Итак, из вывода я получаю то, что два анонимных объекта уничтожаются по завершении инициализации, даже если они объявлены в глобальном контексте.
Отсюда мой вопрос: существует ли способ убедиться, что ссылка на const, сохраненная в классе, всегда будет ссылаться на действительный объект?
Нет, нет Помните, что ссылки — это указатели под капотом, и обычно они не управляют временем жизни объекта, на который они ссылаются (см. Вот за исключением, хотя это не относится в этом случае). Я бы порекомендовал просто иметь объект B, если это в куске кода, который вам нужен.
Кроме того, вы можете использовать такой объект, как shared_ptr
в C ++ 11, который удалит объект только после уничтожения указателя в функции и в объекте.
Одна вещь, которую вы можете сделать в class A
:
A(B&&) = delete;
Таким образом, две линии, которые пытаются построить A
из B
временный не удастся скомпилировать.
Это, очевидно, не помешает вам предоставить какой-то другой B
объект с жизнью короче, чем A
объект ссылается на него, но это шаг в правильном направлении и может уловить некоторые случайные / неосторожные злоупотребления. (Другие ответы уже обсуждают сценарии проектирования и альтернативы — я не буду освещать ту же самую тему / могут ли ссылки быть безопасными (r) в иллюстрированный Сценарий уже важный вопрос.)