【发布时间】:2013-01-15 02:02:46
【问题描述】:
我有一些非常基本的测试代码。我有一个只记录所有操作的类。我将它绑定到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)来避免数量过多的副本?
完整代码和问题演示可以在on Codepad找到。
【问题讨论】:
-
我很想看看
std::bind做了什么。 -
这是在调试还是发布?
-
@NicolBolas 仅使用
g++进行编译,除了-O2之外没有特殊标志或选项。尝试使用和不使用 c++11,没有区别。 -
@chris:使用
std::function和std::bind,只会创建two temporaries。 -
我怀疑
boost::bind没有升级到 C++11。
标签: c++ boost-bind boost-function