【发布时间】:2020-08-08 02:19:49
【问题描述】:
我正在使用 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 复制这么多次?
- 将右值作为参数传递给绑定是否正确(在两种实现情况下)?
- 我是否正确理解 bind 会将对象移动到其上下文并存储它,并在调用 foo 时将其作为左值引用传递?
谢谢!
【问题讨论】: