c++ - shared_ptr 的静态成员函数 make_shared

标签 c++ c++11 stl c++14 shared-ptr

使用 libc++ 我在公共(public)部分找到了 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 >.

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

最佳答案

如您所知,当使用此静态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)

关于c++ - shared_ptr 的静态成员函数 make_shared,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35074037/

相关文章:

c++ - 尝试使用 LoadLibrary 加载 DLL 并获取 R6034 "An application has made an attempt to load the C runtime library incorrectly"

c++ - 为自定义路径类型设置 boost property_tree

c++ - 将相同的功能应用于每个数据成员 - 对异构类型进行转换之类的事情

c++ - vector 中的模板推导失败

c++ - ifstream seekg beyond end 不在 VS 2008 Express 中返回 eof?

c++ - STL 容器中的 const 指针

python - 使用 CImg 将图像文件转换为像素 vector ?

c++ - 使用 UTF-8 在非 ASCII 字符上运行 Ascii 正则表达式

C++11 线程 boost 容器

c++ - 访问包含列表的对象列表的内容