【发布时间】:2020-03-08 03:55:06
【问题描述】:
我发现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 进行演示,但任何其他类型的行为都相同)。
案例 1 如何以及为什么起作用?函数返回后fn1闭包是什么状态?
【问题讨论】:
-
我猜这是因为
fn1在foo(fn1)中被隐式转换为std::function。那么这个临时函数就是一个右值。 -
@RichardCritten 我真的不确定,所以我没有发布答案。我认为现在不需要另一个了。
-
@eike np 我经常有同样的感觉,是的,很多答案。
-
@Sumudu 问这个问题的人误导了你,因为他们不知道他们想问什么。他们的意思是:“为什么不能从 lambda 推导出
std::function的模板参数”。你的程序没有尝试推导出std::function的模板参数,所以隐式转换没有问题。 -
您链接的问题的标题有点误导。
std::function有一个接受 lambda 闭包的非显式构造函数,因此存在隐式转换。但是在链接问题的情况下,无法从 lambda 类型推断出std::function的模板实例化。 (例如,std::function<void()>可以从[](){return 5;}构造,即使它具有非 void 返回类型。
标签: c++ lambda closures c++14 rvalue-reference