声明全局 lambda C++ 时出现问题 [重复]

Posted

技术标签:

【中文标题】声明全局 lambda C++ 时出现问题 [重复]【英文标题】:Problem while declaring global lambda C++ [duplicate] 【发布时间】:2021-09-16 17:35:33 【问题描述】:

#include<bits/stdc++.h>
using namespace std;


auto fnc = [&]()->void

    cout << "HELLO WORLD";
    return;
;


int main()


    fnc();


    return 0;

编译此 C++ 代码时发生错误: 非本地 lambda 表达式不能有默认捕获

但是当我从捕获列表中删除与号时,代码运行得很好。

【问题讨论】:

这能回答你的问题吗? Non local lambda and capturing variables - what does "block scope" means 请阅读Why should I not #include <bits/stdc++.h>?和Why using namespace std is bad practice。 【参考方案1】:

不确定我是否正确,但&amp; 使作用域的变量可以通过引用访问 lambda,并且由于您没有传递给 lambda 函数的参数,因此会引发错误。

[] 表示您引用的变量将无权访问,因此当您从捕获列表中删除 &amp; 时,这可能是您的代码运行正常的原因

https://docs.microsoft.com/en-us/cpp/cpp/lambda-expressions-in-cpp?view=msvc-160

更新:

auto lambda = [&]() -> void
    cout << "Hola mundo";
;

int main()

    lambda();
    return 0;
`

【讨论】:

我认为这不会有什么不同。但是当我使用 gcc 版本 6 或更低版本的默认捕获编译上面的代码时,它工作得很好 好的,您是否尝试过删除return 关键字?如果 if 是 void 函数,那么它不应该返回任何东西。编辑:这是我编写的代码,它与您的代码完全相同,但没有 return 关键字。 (我更新了答案) 还有,为什么要加bits/stdc++.h

以上是关于声明全局 lambda C++ 时出现问题 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

更改函数列表时出现意外结果(lambda)[重复]

如何重置全局声明的向量[重复]

将全局声明的缓冲区写入 FLASH 时出现 STM32 Hardfault 异常

尝试声明大数组时出现分段错误和核心转储[重复]

将结构前向声明为类时出现 Visual C++ 2015 链接器错误

以编程方式(但不是以声明方式)实例化小部件时出现 Dojo 重复 ID 错误