Почему нет безопасной альтернативы 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*();
}
Есть ли веская причина, почему стандарт не предусматривает такого рода вещи?