为什么“的boost ::功能=的boost ::绑定(...)”创建的临时13?(Why is “

2019-07-19 01:47发布

我有一些非常基本的测试代码。 我有一个类,用来记录其上的所有操作。 我把它绑定到一个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 ),以避免拷贝的荒谬多少?

全部代码和问题实证可以发现在键盘 。

Answer 1:

如果删除“FUNC =”赋值部分副本的数量降低到4比13相当好。

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

因此,解决办法很简单 - 不要使用boost ::功能



文章来源: Why is “boost::function = boost::bind(…)” creating 13 temporaries?