【发布时间】:2020-05-01 21:55:13
【问题描述】:
在 Cpp 入门第 5 版中。第393页
如果函数返回一个 lambda,那么 - 出于同样的原因 函数不能返回对局部变量的引用——那个 lambda 不得包含引用捕获。
#include <iostream>
using namespace std;
auto foo(ostream &os) {
auto f = [&os]() -> std::ostream& { os << "Hello World !" << endl; return os;};
f();
return f;
}
void main() {
foo(cout);
auto f = foo(cout);
system("pause");
f();
}
此代码在 msvc 2019 中编译时没有警告。它似乎也运行良好。捕获的os 引用了std::cout,它存在于foo 的范围之外。 f() 是未定义的行为吗?如果是,auto f = foo(cout); 是否也是未定义的行为(即 lambda 的返回和分配)?
【问题讨论】:
-
只要捕获的变量和 lambda 一样长,我认为没问题。
-
捕获的变量是
os,我认为是对cout的本地引用。它比 lambda 寿命长,我想,我可能错了 -
据我所知,定义的行为,只要在销毁 lambda 捕获的实例后不调用您的 lambda(并且实际上尝试使用它),您就可以开始
-
我将其改写为:不得包含对局部变量的引用
-
我发现了一个副本,它与您的示例基本相同。它通过引用而不是流来捕获 int。