首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >静态成员函数make_shared of shared_ptr

静态成员函数make_shared of shared_ptr
EN

Stack Overflow用户
提问于 2016-01-28 23:20:09
回答 2查看 1.1K关注 0票数 11

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

代码语言:javascript
复制
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)没有提到静态成员函数make_shared of std::shared_ptr

目前使用该功能是否有问题?为什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-28 23:42:12

在使用这个静态make_shared成员函数时,您依赖于g++ /其标准库的特定于实现的扩展,正如您已经知道的那样。为了从中获得一点好处,我宁愿保持代码的可移植性,并使用std::make_shared

对于您提到的情况,即使用复制或从现有构造函数中移动构造函数来构造一个新对象,我可以建议另一种方法(未经测试;为了实现C++11-兼容性,您必须添加一个尾部返回类型):

代码语言:javascript
复制
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)

票数 5
EN

Stack Overflow用户

发布于 2016-01-28 23:33:40

FWIW,有

代码语言:javascript
复制
template<class T, class... Args> shared_ptr<T> make_shared(Args&&... args);

作为非会员的职能。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35074037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档