gpt4 book ai didi

c++ - 为什么非捕获变量会引发警告?

转载 作者:搜寻专家 更新时间:2023-10-31 01:42:20 26 4
gpt4 key购买 nike

在 VS2015 中考虑这段代码:

int a,b;

[]
{
int a; // C4456: declaration of 'a' hides previous local declaration
};

为什么 a 在 lambda 中发出这样的警告?它在 VS2013 中编译良好。

编辑:有趣的是(而且是错误的),以下不是 VS2013 中的错误:

 [a]
{
int a; // No error, even if `a` is captured.
a++;
};

最佳答案

第一个警告肯定看起来像是编译器错误。

第二个不是错误,因为您是在不同的范围内声明它。变量只被捕获,不被捕获声明。

想想这可能生成的函数对象

class foo {
foo(int a): a(a) {}

void operator()() {
int a;
}

int a;
};

a 的两个声明之间没有冲突,并且由于 lambda 编译成这样的东西,这就是捕获不关心内部声明的原因。

更新:这与

完全不同
void foo(int a) {
int a;
}

因为在 lambda 的情况下,它将被编译为一个带有 operator() 的类,并且捕获将作为构造函数参数传入,这就是为什么它们在不同的范围。

关于c++ - 为什么非捕获变量会引发警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27058449/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com