shared_ptr的静态成员函数make_shared

11

我使用 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);

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

目前使用该函数是否不好?为什么?


2
它不在标准中存在,这难道不足以成为一个好理由吗? - T.C.
你似乎已经知道这个函数是非标准的。这不仅仅是基于观点的问题吗? - Brian Bi
1
我刚刚查看了标准规范,但没有描述这个。这似乎是实现特定的。 这在VS2015 c++标准库中不起作用。 - Guillaume Gris
@Brian 我猜想我的源代码可能已经过时、不完整或不准确,因为它是公共维基百科。 - Tomilov Anatoliy
@T.C. 不是针对我,但可能适用于其他人。 - Tomilov Anatoliy
2个回答

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));
}

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

对我来说,一个非常接近的替代方案是在用户命名空间中为std::shared_ptr本身的make_shared进行重载 - Tomilov Anatoliy

3

顺便提一下,这里有

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

作为非成员函数。
您可以使用std :: make_shared而不是std :: shared_ptr :: make_shared。

这是我和许多其他处理C++14的<memory>的人的经典格言。 - Tomilov Anatoliy
@Orient,我没听懂。 - R Sahu
1
抄袭常言是指陈词滥调、普遍真理的同义词。 - Tomilov Anatoliy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接