为什么“boost :: function = boost :: bind(...)”创造了13个临时工?

时间:2013-01-31 03:11:08

标签: c++ boost-bind boost-function

我有一些非常基本的测试代码。我有一个类,只记录它上面的所有操作。我把它绑定到这样的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

我无法使用refcref,因为我确实需要它来制作对象的副本。我做错了什么吗?或者我是否需要使用包装器(如boost::shared_ptr)来避免荒谬的副本数量?

可以找到完整的代码和问题演示on Codepad

1 个答案:

答案 0 :(得分:3)

如果删除“func =”分配部分,副本数量将减少到4,这比13要好。

template <class F>
void callF(F fun)
{
}
callF(boost::bind(&func, fl));

所以解决方案很简单 - 不要使用boost :: function