Есть ли у 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

Другие вопросы по тегам