【发布时间】:2019-08-28 18:27:59
【问题描述】:
以下代码标准正确吗? (godbolt)
即by-ref 捕获表示临时的转发引用,并从函数中返回生成的 lambda 值,在同一表达式中。
当然,存储 lambda 供以后使用会使它包含一个悬空引用,但我指的是 main 中的确切用法。
我的疑虑与this SO answer 和可能的this language defect 有关。具体来说,有一条令人生畏的评论说“标准中的引用捕获生命周期规则引用捕获的变量,而不是数据及其范围” - 这似乎是说捕获的对临时的引用可能在我的代码。
#include <stdlib.h>
#include <string.h>
#include <cassert>
template<typename F>
auto invoke(F&& f)
{
return f();
}
template<typename F>
auto wrap(F&& f)
{
return [&f]() {return f();}; // <- this by-ref capture here
}
int main()
{
int t = invoke(wrap(
[]() {return 17;}
));
assert(t == 17);
return t;
}
【问题讨论】:
-
这是您的实际用例吗?因为你当然可以做
return f();。 -
只是检查。你意识到
invoke和wrap中的那些通用引用没有被传播,对吧?你也可以传递左值引用。 -
@SombreroChicken 在实际用例中
wrap当然会做一些事情 -
@RichardHodges 是的,我可以声明
invoke采用 l-value ref 但它不会改变问题 -invoke函数只是用作使用从 @ 返回的 lambda 的一种方式987654332@ 在同一个表达式内
标签: c++ lambda temporary-objects forwarding-reference