C++ 通过引用捕获 Lambda
C++ Lambda capture by reference
据
我所知,在运行以下代码后,myString应该得到值"Inside lambda3.secondLambda"。相反,它仍将具有值"已初始化"。
std::string myString("Initialized");
auto lambda3 = [&]() { [&myString]() { myString = "Inside lambda3.secondLambda"; }; };
第一个 lambda 通过引用捕获所有变量,sencond 通过引用仅捕获 myString。为什么它的行为没有像我预期的那样?
通过指定 lambda 的主体,您可以指定在调用 lambda 的 operator()
时将调用的代码。
所以你需要实际调用lambdas,否则它只是函数定义中的代码,永远不会被调用。你可以做:
auto lambda3 = [&] {
auto l = [&myString] {
myString = "Inside lambda3.secondLambda";
};
l();
};
lambda3();
为了更进一步,您可以返回内部 lambda,然后像这样执行它:
auto lambda3 = [&] {
return [&myString] {
myString = "Inside lambda3.secondLambda";
};
};
lambda3()();
您已经定义了一个闭包,但实际上并未运行该函数。如果要执行其正文,则必须像lambda3()
一样实际运行它。
有嵌套的 lambda,因此您还需要运行 lambda 中的内容。目前尚不清楚您为什么要这样做。您的内部 lambda 既不会在外部 lambda 的作用域内分配(因此您可以使用相同的语法在 lambda 内运行它),也不会返回(因此此 lambda 的调用方可以运行它返回的内容)。
如果您退回它,您可以执行以下操作lambda3()()
:
auto lambda3 = [&]() { return [&myString]() { myString = "Inside
lambda3.secondLambda"; }; };
注意:仅添加了单词 return
以允许lambda3()()
工作。
在此特定示例中,最好只提供:
auto lambda3 = [&myString]() {
myString = "Inside lambda3.secondLambda"; };
相关文章:
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- c++ lambda:柯里和函数:使用按值捕获与按引用捕获返回不同的结果
- 引用捕获和在 lambda 中通过引用发送参数有什么区别 (C++)
- 修改在 std::future 的 lambda 中引用捕获的值
- clang++ 9.0 如何神奇地治愈 lambda 中的悬空引用使用?
- 为什么 lambda nullptr 取消引用在这种情况下有效?
- 仅通过引用捕获的 lambda 表达式是否保证不会抛出?
- 当lambda执行时,C++lambda捕获的引用具有不同的值
- 无法通过引用捕获 lambda 中的成员变量
- 在 lambda 中从引用类型捕获的值的类型,不使用通用捕获
- 将引用和指针传递给 lambda
- 为什么访问我的引用捕获变量会导致我的 lambda 函数出现段错误?
- 我无法通过引用捕获传递 lambda
- 我们应该在 lambda 中通过常量引用来捕获吗?
- 在 lambda 中通过引用捕获thread_local变量无法按预期工作
- lambda 表达式中引用捕获的 constexpr 变量和非显式捕获的 constexpr 变量之间的区别
- 列出生成器(lambda的向量)会导致通过引用捕获的非常奇怪的行为
- 无法使用带有常量引用的 lambda 对 std::vector 进行排序
- 返回对 std::函数包装的 lambda 中静态变量的引用会导致段错误
- lambda 和映射,引用参数 - 编译错误