C++声明全局lambda时报非局部lambda不能使用默认捕获错误如何解决
C++全局lambda使用捕获默认报错的原因
你给出的代码触发编译错误是C++标准的明确约束导致的,具体逻辑如下:
- lambda的捕获列表仅用于捕获定义lambda所在作用域的局部自动变量,捕获默认符
&的作用是自动按引用捕获所有当前作用域内被lambda用到的局部变量。 - 你代码中的lambda定义在全局作用域,该作用域下不存在任何局部自动变量,捕获默认符没有对应的可捕获对象,C++标准明确规定:非局部作用域的lambda表达式不能使用任何捕获默认(包括按引用捕获默认
&和按值捕获默认=),因此编译器直接抛出non-local lambda expression cannot have a capture-default错误。 - 你删除
&后捕获列表变为[],代表该lambda不捕获任何外部局部变量,完全符合标准要求,因此可以正常编译。且你代码中用到的cout是标准库全局对象,不需要捕获就能直接访问,修改后不影响功能。
报错代码复现
#include<bits/stdc++.h> using namespace std; auto fnc = [&]()->void{ cout << "HELLO WORLD"; return; }; int main() { fnc(); return 0; }
内容的提问来源于stack exchange,提问作者VASU OBEROI
相关产品推荐
相关产品推荐

