int n;
int main()
{
[](){ n = 0; }(); // clang says "ok"
int m;
[](){ m = 0; }(); // clang says "not ok"
}
我只是想知道:
如果lambda没有捕获到任何内容,是否允许它按照C++标准访问全局变量?
发布于 2017-05-07 04:04:14
是的,当然。适用普通名称查找规则。
expr.prim.lambda/7 ...出于名称查找的目的...复合语句是在lambda表达式的上下文中考虑的。
Re:为什么局部变量与全局变量被区别对待。
expr.prim.lambda/13 ...如果lambda表达式或通用lambda odr的函数调用操作符模板的实例化使用(3.2)
this
或从其到达范围具有自动存储持续时间的变量,则该实体应由lambda表达式捕获。
expr.prim.lambda/9最小封闭作用域是块作用域(3.3.3)的λ表达式是一个局部λ表达式...局部lambda表达式的到达范围是直到并包括最里面的封闭函数及其参数的封闭范围的集合。
在您的示例中,m
是一个从lambda的到达范围自动存储持续时间的变量,因此应该被捕获。n
并非如此,因此也不必如此。
发布于 2017-05-07 04:52:08
实际上,[](){ n = 10; }();
并没有捕获任何东西,而是使用了全局变量。
int n;
int main()
{
[](){ n = 10; }(); // clang says "ok"
std::cout << n; // output 10
}
请参阅capture-list in Explaination
capture- list -以逗号分隔的零个或多个捕获列表,可以选择以capture-default开头。
采集列表的传入方式如下(详见下文):
捕获通过引用捕获当前对象(*
,则通过复制捕获lambda主体中使用的所有自动变量,通过引用捕获当前对象
发布于 2018-02-28 10:38:01
默认情况下访问全局、静态和常量变量:
#include <iostream>
int n;
int main()
{
[](){ n = 10; }();
std::cout << n << std::endl;
static int m = 1;
[](){ m = 100; }();
std::cout << m << std::endl;
const int l = 200;
[](){ std::cout << l << std::endl; }();
}
https://stackoverflow.com/questions/43827651
复制相似问题