空lambda捕获列表[]
创建一个没有闭包对象的普通函数。那么,为什么给出这个例子:
int main(int argc, const char *argv[]) {
auto _foo = [] (int argc) {
return argc - 1;
};
return _foo(argc);
}
gcc(4.8.5和5.4.0)是否警告lambda的argc
会影响外部范围的argc
变量?
In lambda function:
warning: declaration of ‘int argc’ shadows a parameter [-Wshadow]
auto _foo = [] (int argc) {
^
note: shadowed declaration is here
int main(int argc, const char *argv[]) {
^
毕竟,没有外部/周围闭合状态可以被遮蔽。
答案 0 :(得分:1)
这是一个警告。 lambda中的代码可能会使读者混淆正在使用的变量。
警告不是关于不良行为,只是不可读的代码,而且它是一个非捕获的lambda并不能真正使代码更具可读性。
内部作用域中阴影变量的规则对于非捕获lambda和具有相同名称的参数的规则同样明确,并且出于同样的原因存在警告。