对于新操作员,我们有std::nothrow
版本:
std::unique_ptr<T> p = new(std::nothrow) T();
对于std::make_shared
或std::make_unique
,我们有这样的东西吗?
答案 0 :(得分:8)
不,我们没有。浏览make_unique
和make_shared
的cppreference页面,我们发现每个版本都使用默认的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,
使用此指针时,请不要忘记在使用之前检查指针 版。 — Superlokkus 19年7月18日在10:46