Есть ли у std::make_shared и std::make_unique версия "nothrow"?
Для нового оператора мы имеем std::nothrow
версия:
std::unique_ptr<T> p = new(std::nothrow) T();
Есть ли у нас что-то подобное для std::make_shared
или же std::make_unique
?
1 ответ
Нет, мы не Просматривая страницы cppreference для make_unique
а также make_shared
мы видим, что каждая версия использует по умолчанию new
перегрузки.
Это не сложно реализовать, хотя, что-то вроде этого:
template <class T, class... Args>
std::unique_ptr<T> make_unique_nothrow(Args&&... args)
noexcept(noexcept(T(std::forward<Args>(args)...)))
{
return std::unique_ptr<T>(new (std::nothrow) T(std::forward<Args>(args)...));
}
template <class T, class... Args>
std::shared_ptr<T> make_shared_nothrow(Args&&... args)
noexcept(noexcept(T(std::forward<Args>(args)...)))
{
return std::shared_ptr<T>(new (std::nothrow) T(std::forward<Args>(args)...));
}
(Обратите внимание, что эта версия make_shared_nothrow
не избегает двойного распределения, так как make_shared
делает.) C++20 добавил много новых перегрузок для make_unique
, но они могут быть реализованы аналогичным образом. Кроме того, за комментарий,
Не забудьте проверить указатель перед использованием, при использовании этой версии. - Superlokkus 18 июля 19:46