boost:shared_ptr
创建对象最标准的方法是使用make_shared
Boost 提供的函数:
#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>
struct A {};
A generator() {
return A();
}
int main()
{
using namespace boost;
shared_ptr<A> p = make_shared<A>(generator());
return 0;
}
由于该generator()
函数按值返回一个A
对象,因此上面的语法意味着new
使用 的复制构造函数调用它A
,并且结果指针被包装在一个共享指针对象中。换句话说,make_shared
并没有完全执行到共享指针的转换;相反,它在堆上创建对象的副本并为此提供内存管理。这可能是也可能不是您需要的。
请注意,这等同于 C++11std::make_shared
中的 for 。std::shared_ptr
提供您在问题中提到的便捷语法的一种方法是将转换运算符定义为shared_ptr<A>
for A
:
struct A {
operator boost::shared_ptr<A>() {
return boost::make_shared<A>(*this);
}
};
然后你可以按如下方式使用它:
shared_ptr<A> p = generate();
这将自动“转换”函数返回的对象。同样,这里的转换实际上意味着堆分配、复制和包装在共享指针中。因此,我不确定是否建议定义这样一个方便的转换运算符。它使语法非常方便,但它与所有隐式转换运算符一样,也可能意味着您隐式地导致这些“转换”发生在您没有预料到的地方。