Я обнаружил, что lvalueлямбда-замыкания всегда можно передать в качестве rvalueпараметров функции.
Смотрите следующую простую демонстрацию.
#include <iostream>
#include <functional>
using namespace std;
void foo(std::function<void()>&& t)
{
}
int main()
{
// Case 1: passing a `lvalue` closure
auto fn1 = []{};
foo(fn1); // works
// Case 2: passing a `lvalue` function object
std::function<void()> fn2 = []{};
foo(fn2); // compile error
return 0;
}
Случай 2 является стандартным поведением (я просто использовал std::functionдля демонстрационных целей, но любой другой тип будет вести себя так же).
Как и почему работает первый случай? Каково состояние fn1закрытия после возврата функции?
std::functionбыть выведены из лямбды?». Ваша программа не пытается вывести аргументы шаблона std::function, поэтому нет проблем с неявным преобразованием.
std::functionимеет неявный конструктор, который принимает лямбда-замыкания, поэтому существует неявное преобразование. Но в обстоятельствах связанного вопроса, создание шаблона std::functionне может быть выведено из лямбда-типа. (Например , std::function<void()>можно построить из [](){return 5;}даже если она имеет непустой тип возвращаемого значения .
fn1неявно преобразуетсяstd::functionвfoo(fn1). Эта временная функция тогда является значением.