我发现lvalue
lambda闭包始终可以作为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
为了演示目的而使用a ,但是任何其他类型的行为都相同)。
案例1如何以及为什么起作用?fn1
函数返回后关闭的状态是什么?
std::function
从lambda推论模板参数”。您的程序不会尝试推导的模板参数std::function
,因此隐式转换没有问题。
std::function
有一个接受lambda闭包的非显式构造函数,因此存在隐式转换。但是在链接问题的情况下,std::function
无法从lambda类型推断出的模板实例化。(例如std::function<void()>
,[](){return 5;}
即使具有非空返回类型也可以从构造
fn1
被隐式转换为std::function
infoo(fn1)
。那个临时函数就是一个右值。