静态成员函数make_shared shared_ptr

static member function make_shared of shared_ptr

本文关键字:shared ptr make 函数 静态成员      更新时间:2023-10-16

使用libc++,我在公共部分发现了std::shared_ptr::make_shared()静态成员函数。当我已经为std::shared_ptr的特化定义了类型别名时,这非常方便:

using T = int;
using P = std::shared_ptr< T >;
auto p = P::make_shared(123); // <=> std::make_shared< T >(123)
static_assert(std::is_same< decltype(p), P >::value);

我担心标准合规性,因为来自受信任来源的文章 (1, 2) 没有提到静态成员函数make_shared std::shared_ptr

目前使用该功能不好吗?为什么?

使用此静态make_shared成员函数时,您依赖于 g++/其标准库的特定于实现的扩展,如您所知。为了从中获得一点点收益,我宁愿保持我的代码可移植并使用std::make_shared

对于

您提到的情况,即使用现有构造函数的复制或移动构造函数构造一个新对象,我可以建议一个替代方案(未经测试;对于 C++11 兼容性,您必须添加一个尾随返回类型):

template <typename T>
auto share_ptr_to_new(T&& v) {
    using T2 = typename std::remove_reference<T>::type;
    return std::make_shared<T2>(std::forward<T>(v));
}

在上面的示例中,您可以只编写auto p = share_ptr_to_new(123) .

FWIW,有

template<class T, class... Args> shared_ptr<T> make_shared(Args&&... args);

作为非成员函数。

您应该能够使用 std::make_shared 而不是 std::shared_ptr::make_shared