13

对于 new 运算符,我们有以下std::nothrow版本:

std::unique_ptr<T> p = new(std::nothrow) T();

我们对std::make_sharedor有类似的东西std::make_unique吗?

4

1 回答 1

10

不,我们没有。make_unique查看and的 cppreference 页面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 2019年 7 月 18 日在 10:46

于 2019-07-18T10:31:07.670 回答