gpt4 book ai didi

c++ - std::make_shared 和 std::make_unique 有 "nothrow"版本吗?

转载 作者:可可西里 更新时间:2023-11-01 18:28:55 24 4
gpt4 key购买 nike

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

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

std::make_sharedstd::make_unique 有这样的东西吗?

最佳答案

不,我们没有。查看 make_unique 的 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 添加了许多新的重载>,但它们可以以类似的方式实现。此外,根据 comment ,

Don't forget to check the pointer before using it, when using this version. — Superlokkus Jul 18 '19 at 10:46

关于c++ - std::make_shared 和 std::make_unique 有 "nothrow"版本吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57092289/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com