【发布时间】:2021-02-28 00:21:40
【问题描述】:
让我们考虑一下这段代码:
int main()
{
int a = 1;
auto f1 = [a]() {
int a = 10;
return a;
};
auto f2 = []() {
int a = 100;
return a;
};
return a + f1() + f2();
}
当使用标志 -Wshadow 和 gcc(在 10.2 上测试)时,我们会收到以下警告:
<source>:26:13: warning: declaration of 'a' shadows a lambda capture [-Wshadow]
6 | int a = 10;
<source>:21:13: warning: declaration of 'a' shadows a previous local [-Wshadow]
11 | int a = 100;
我理解第一种情况,我们显式捕获a,因此隐藏了原始本地。然而,第二种情况很有趣,因为如果我们删除声明 int a = 100;,我们会得到一个编译错误 (= error: 'a' is not captured: return a;)。这不是“证明”声明与原始本地声明不在同一范围内,因此我们实际上并没有隐藏任何东西吗?因此我的问题是,警告(对于第二种情况)是否确实有效,或者 gcc 是否在这里有点过于严格?
【问题讨论】:
-
省略
int a = 100;行时会出现什么编译器错误? -
我认为这是一个编译器错误 - clang does not report it。
-
@PaulSanders Clang 确实会报告
f2的警告,但如果您提供-Wshadow-all选项。 -
@heapunderrun 对不起,我的错。当我从 gcc 切换到 clang 时,Wandbox 清除了编译器选项。
标签: c++ gcc lambda compiler-warnings