【发布时间】:2015-08-09 05:07:07
【问题描述】:
我在理解 boost::factory 的工作方式方面遇到了问题。下面的代码会抛出test2的ctor。
#include <boost/functional/factory.hpp>
#include <boost/function.hpp>
typedef boost::function<A*()> creator;
typedef std::map<string,creator> factory;
class A{
}
class AA : A {
}
class AB : A {
}
class C{
public:
C(factory& f);
factory _f;
}
int main(){
factory f;
f["1"] = boost::factory<AA*>();
f["2"] = boost::factory<AB*>();
C test(f);
C test2(f);
}
C::C(factory& f){
_f = f;
A* t = _f["1"]();
}
消息是
在抛出一个实例后调用终止 'boost::exception_detail::clone_impl
' what(): 调用空 boost::function
我想我不理解这里的复制/移动行为,这就是问题所在。
据我了解,工厂被复制到 C::C 中,因此每次调用 _f[something]() 都应该调用自己的函数。但不知何故,该函数在测试的 ctor 中被移出工厂,然后我得到一个错误的函数调用,导致 f["1"] 处于未定义状态。
请帮忙。
【问题讨论】: