我有一些非常基本的测试代码。我有一个只记录所有操作的类。我将它绑定到这样的boost::function
对象:
void Function(const Foo&)
{
printf("Function invoked\n");
}
// ...
boost::function<void(void)> func;
{
Foo f;
printf("\nConstructing function\n");
func = boost::bind(&Function, f);
printf("Construction complete\n\n");
}
我希望函数对象包含f
. 因此,必须创建至少一个副本。但是,我发现我得到了13 个临时对象。输出是:
Constructing function
Foo::Foo(const Foo&)
Foo::Foo(const Foo&)
Foo::Foo(const Foo&)
Foo::Foo(const Foo&)
Foo::~Foo
Foo::Foo(const Foo&)
Foo::~Foo
Foo::~Foo
Foo::Foo(const Foo&)
Foo::Foo(const Foo&)
Foo::Foo(const Foo&)
Foo::Foo(const Foo&)
Foo::Foo(const Foo&)
Foo::Foo(const Foo&)
Foo::Foo(const Foo&)
Foo::~Foo
Foo::~Foo
Foo::~Foo
Foo::~Foo
Foo::~Foo
Foo::Foo(const Foo&)
Foo::~Foo
Foo::Foo(const Foo&)
Foo::~Foo
Foo::~Foo
Foo::~Foo
Foo::~Foo
Construction complete
我不能使用ref
或者cref
因为我确实需要它来制作对象的副本。我做错了什么可怕的事情吗?或者我是否需要使用包装器(如boost::shared_ptr
)来避免荒谬的副本数量?
完整的代码和问题演示可以在 Codepad上找到。