2015-09-14 4 views
2

Учитывая функции:Почему авто не работает с некоторыми лямбдах

void foo(std::function<void(int, std::uint32_t, unsigned int)>& f) 
{ 
    f(1, 2, 4); 
} 

Почему это компиляции:

std::function<void(int a, std::uint32_t b, unsigned int c)> f = 
    [] (int a, std::uint32_t b, unsigned int c) -> void 
{ 
    std::cout << a << b << c << '\n'; 
    return; 
}; 

И это не удается скомпилировать:

auto f = 
    [] (int a, std::uint32_t b, unsigned int c) -> void 
{ 
    std::cout << a << b << c << '\n'; 
    return; 
}; 

С ошибкой :

5: error: no matching function for call to 'foo' 
    foo(f); 
    ^~~ 
6: note: candidate function not viable: no known conversion from '(lambda at...:9)' to 'std::function<void (int, std::uint32_t, unsigned int)> &' for 1st argument 
void foo(std::function<void(int, std::uint32_t, unsigned int)>& f) 
    ^
+0

Вы пробовали с различными компиляторами? Хорошая идея - попробовать как clang, так и gcc. – user1095108

+0

Возможный дубликат: https://stackoverflow.com/questions/1565600 –

ответ

13

Лямбда не std::function. Таким образом, вызов функции foo требует создания временного объекта std::function из лямбда и передачи этого временного аргумента. Однако функция foo ожидает модифицируемое значение l типа std::function. Очевидно, что временное значение prvalue не может быть привязано ссылкой на константу lvalue. Возьмите по значению вместо:

void foo(std::function<void(int, std::uint32_t, unsigned int)> f) 
{ 
    f(1, 2, 4); 
} 
+2

Удерживание 'const &' должно работать, верно? –

+0

@ dau_sama: да –