Давайте предположим, что я хочу передать функциональный объект, созданный std::bind
по ссылке на функцию:
void myCallback(int i, int j)
{
std::cout << "toCall , i=" << i << " j=" << j;
}
void worker(std::function<void(int)> & callback)
{
callback(111);
}
int main(int argc, char** argv)
{
auto foo = std::bind(myCallback, std::placeholders::_1, 222);
worker(foo);
}
Это не компилируется
![compiler error](https://i.stack.imgur.com/MdC8m.png)
Код серьезности Описание Ошибка состояния подавления строки файла проекта C2664 'void worker (std :: function &)': невозможно преобразовать аргумент 1 из std :: _ Binder &, int> 'в' std :: function & 'asn1test_1 D: ..... \ asn1test_1 ..... cpp 302
Однако передача по значению работает:
void worker(std::function<void(int)> callback)
{
callback(111);
}
Когда Я избегаю "auto
" и использую вместо этого
std::function<void(int)> foo = std::bind(myCallback, std::placeholders::_1, 222);
, он работает как с передачей по ссылке, так и по значению.
Q1: Почему это поведение?
Q2: Какой будет «правильный» способ или тип данных для передачи объекта, созданного std::bind
, в функцию?