boost :: bind()创建参数的许多副本

我正在使用boost :: bind(Boost 1.64.0和gcc 8.3.0)创建一个可调用对象,并注意到了一个有趣的功能 传入绑定构造函数作为可包装函数的参数的对象被多次复制。 即使对象包装在std :: move()中。尽管std :: bind可以正常工作。 例:

#include <iostream>
#include <boost/bind.hpp>
#include <functional>

class Test
{
public:
    Test()
    {
        std::cout << "Create\n";
    }

    Test(const Test& rhs)
    {
        std::cout << "Copy\n";
    }

    Test(Test&& rhs)
    {
        std::cout << "Move\n";
    }

    ~Test() noexcept
    {

    }
};

void foo(Test& t)
{

}


int main()
{
    Test t;
    auto f = boost::bind(&foo, t);
    f();
}

boost :: bind(&foo,t);的输出;

Create
Copy
Copy
Copy
Copy
Copy

boost :: bind(&foo,std :: move(t))的输出;

Create
Move
Copy
Copy
Copy
Copy

std :: bind(&foo,t);的输出

Create
Copy

std :: bind(&foo,std :: move(t))的输出;

Create
Move
  • 为什么boost复制如此多次?
  • 将rvalue作为参数传递来绑定是否正确(在两种实现方式中)?
  • 我是否正确理解bind会将对象移动到其上下文并存储它,并在调用foo时将其作为左值引用传递?

谢谢!

评论