shared_ptr的静态成员函数make_shared

Ori*_*ent 10 c++ stl shared-ptr c++11 c++14

使用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);
Run Code Online (Sandbox Code Playgroud)

我担心符合标准,因为物品(1,2)从可信赖的来源没有提及静态成员函数make_sharedstd::shared_ptr.

目前使用该功能是不是很糟糕?为什么?

Obe*_*ron 5

使用此静态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));
}
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,你可以只写auto p = share_ptr_to_new(123).