非局部 lambda 和捕获变量 - "block scope"是什么意思
Non local lambda and capturing variables - what does "block scope" means
我目前正在玩 c++11 lambdas,发现了一个我无法理解的例子。根据标准:
最小封闭作用域为块作用域 (3.3.3) 的 lambda 表达式是局部 lambda 表达式;any 其他 lambda 表达式在其 lambda 介绍器中不应有捕获列表
所以,我创建了一个琐碎的例子:
int a = 10;
auto x = [a] { return 1;};
int main() {
int k = 5;
auto p = [k]{ return k; };
return 0;
}
ideone中的代码:http://ideone.com/t9emu5
我预计这段代码不会编译,因为在非块范围内捕获变量(或者至少认为自动 x = ...部分不在块范围内)。但是代码正在编译 - 可以吗?
如果可以 - 块范围是什么?
(我不确定我使用的编译器版本,因为目前我只能访问 ideone 站点。
感谢您的解释!
看起来这是一个编译器扩展。 G++4.8.1 在给出警告的同时编译它:
警告:捕获具有非自动存储持续时间的变量"A" [默认启用]
clang++3.4 不会编译这个:
错误:无法捕获"A",因为它没有自动存储持续时间
两者都指 [expr.prim.lambda]/10
捕获列表中的标识符使用非限定名称查找的常规规则(3.4.1)进行查找;每个此类查找都应找到一个变量,该变量具有在本地 lambda 表达式的到达范围内声明的自动存储持续时间。
似乎他们没有另外检查 lambda 的封闭范围,我可以想象这将是多余的(在非块/命名空间范围内没有具有自动存储持续时间的变量名称)。
块作用域在 [basic.scope.block]/1 中定义
在块 (6.3) 中声明的名称是该块的本地名称;它具有块范围。
块定义为:
为了在预期的地方可以使用多个语句,提供了复合语句(也等效地称为"块")。
复合语句:
{
语句-序列选择}
所以你是对的,你的全局声明的 lambda 不在块范围内。
- 相当于 pybind11 中的 boost::p ython py::scope().attr()
- 如何修复"error: ‘_1’ was not declared in this scope"?
- "local scope"中的 C++ 初始化静态变量
- fopen_s 未在 scope(C++:codeblocks ) 中声明
- 使用 scope 运算符 (::) 引用另一个文件中的类
- 类中的数组变量C++导致"was not declared in this scope"实现文件的一个函数中错误,但在构造函数中不会导致错误
- 为什么我需要在以下示例中在 block_cache.h 之前包含 block_cache_key.h 和 block.h
- 什么 clang-format 相当于 rustfmt 的 indent_style=Block?
- 如何定义此"if block"中其他无效输入的值,以便在c ++中将字符串转换为对象?
- 如何解决"cout was not declared in this scope"错误?
- 为什么当"::"的行为不像运算符时被称为'scope resolution operator'?
- 为什么程序显示我"was not declared in this scope"?
- C++标准在[basic.scope.hiding]中"same scope"到底意味着什么?
- 为什么我会收到"getuid was not declared in that scope"错误?
- 即使包含 <time.h 后仍"‘CLOCK_PER_SEC’ was not declared in this scope"错误>
- de if-Block 是什么意思
- 为什么我们需要 [basic.scope.class]/2?
- 非局部 lambda 和捕获变量 - "block scope"是什么意思
- 精神X3编译错误"a template declaration cannot appear at block scope"
- 编译宙斯时'static functions with block scope are illegal'错误