Почему нет безопасной альтернативы unique_ptr :: operator * ()?

std::vector имеет функцию-членat() в качестве безопасной альтернативыoperator[], так что применяется проверка границ и не создаются висячие ссылки:

void foo(std::vector<int> const&x)
{
  const auto&a=x[0];     // What if x.empty()? Undefined behavior!
  const auto&a=x.at(0);  // Throws exception if x.empty().
}

Тем не мение,std::unique_ptr не хватает соответствующей функциональности:

void foo(std::unique_ptr<int> const&x)
{
  const auto&a=*x;       // What if bool(x)==false? Undefined behavior!
}

Было бы здорово, если быstd::unique_ptr была такая безопасная альтернатива, скажем членref() (а такжеcref()), который никогда не возвращает висячую ссылку, а скорее выдает исключение. Возможная реализация:

template<typename T>
typename add_lvalue_reference<T>::type
unique_ptr<T>::ref() const noexcept(false)
{
  if(bool(*this)==false)
    throw run_time_error("trying to de-refrence null unique_ptr");
  return this->operator*();
}

Есть ли веская причина, почему стандарт не предусматривает такого рода вещи?

Ответы на вопрос(6)

Ваш ответ на вопрос