使用 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);
我担心标准合规性,因为来自可信来源的文章(1,2)没有提到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/