Есть ли способ быть уверенным, что ссылка на const, сохраненная в классе, всегда будет ссылаться на действительный объект?

Я написал следующий пример кода:

#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, сохраненная в классе, всегда будет ссылаться на действительный объект?

1

Решение

Нет, нет Помните, что ссылки — это указатели под капотом, и обычно они не управляют временем жизни объекта, на который они ссылаются (см. Вот за исключением, хотя это не относится в этом случае). Я бы порекомендовал просто иметь объект B, если это в куске кода, который вам нужен.

Кроме того, вы можете использовать такой объект, как shared_ptr в C ++ 11, который удалит объект только после уничтожения указателя в функции и в объекте.

1

Другие решения

Одна вещь, которую вы можете сделать в class A:

A(B&&) = delete;

Таким образом, две линии, которые пытаются построить A из B временный не удастся скомпилировать.

Это, очевидно, не помешает вам предоставить какой-то другой B объект с жизнью короче, чем A объект ссылается на него, но это шаг в правильном направлении и может уловить некоторые случайные / неосторожные злоупотребления. (Другие ответы уже обсуждают сценарии проектирования и альтернативы — я не буду освещать ту же самую тему / могут ли ссылки быть безопасными (r) в иллюстрированный Сценарий уже важный вопрос.)

2

По вопросам рекламы [email protected]