Я обнаружил, что 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)
. Эта временная функция тогда является значением.