¿Por qué no hay una alternativa segura a unique_ptr :: operator * ()?

std::vector tiene la función miembroat() como una alternativa segura aoperator[], de modo que se aplica la comprobación de límite y no se crean referencias colgantes:

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().
}

Sin embargo,std::unique_ptr carece de la funcionalidad correspondiente:

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

Sería genial sistd::unique_ptr tenía una alternativa tan segura, digamos miembroref() (ycref()) que nunca devuelve una referencia colgante, sino que arroja una excepción. Posible implementación:

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*();
}

¿Hay alguna buena razón por la cual el estándar no proporciona este tipo de cosas?

Respuestas a la pregunta(6)

Su respuesta a la pregunta