空lambda捕获仍然影响外部范围?

时间:2016-09-26 02:02:32

标签: c++11 lambda gcc-warning

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[]) {
              ^

毕竟,没有外部/周围闭合状态可以被遮蔽。

1 个答案:

答案 0 :(得分:1)

这是一个警告。 lambda中的代码可能会使读者混淆正在使用的变量。

警告不是关于不良行为,只是不可读的代码,而且它是一个非捕获的lambda并不能真正使代码更具可读性。

内部作用域中阴影变量的规则对于非捕获lambda和具有相同名称的参数的规则同样明确,并且出于同样的原因存在警告。