Я работал с boost :: bind (Boost 1.64.0 и g cc 8.3.0), чтобы создать вызываемый объект, и заметил интересную особенность. Объект, переданный в конструктор bind в качестве аргумента для функции с возможностью переноса, копируется многократно. Даже если объект обернут в 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
- Почему так многократно повышается копирование?
- Правильно ли передавать rvalue в качестве аргумента для привязки (в обоих случаях реализации)?
- Делать Я правильно понимаю, что bind переместит объект в его контекст и сохранит его, а когда вызывается foo, передает его как ссылку lvalue?
Спасибо!