使用 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);
我担心标准合规性,因为来自受信任来源的文章(1,2)未提及make_shared
的静态成员函数std::shared_ptr
。
目前使用该功能是不是很糟糕?为什么呢?
答案 0 :(得分: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)
。
答案 1 :(得分:3)
FWIW,有
template<class T, class... Args> shared_ptr<T> make_shared(Args&&... args);
作为非会员职能。
您应该可以使用std::make_shared
代替std::shared_ptr::make_shared
。