¿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?