При включении -Wshadow
во время компиляции, почему gcc предупреждает, когда имя параметра лямбды, определенного в производном классе, "затеняет" имя закрытой переменной-члена своего базового класса? Пример:
#include <iostream>
class Base {
private:
int data;
};
class Derived: public Base {
public:
void test(int val) {
auto lambda = [](const auto& data) {};
lambda(val);
}
};
При компиляции gcc - протестировано с версией 9.2 - показывает (https://gcc.godbolt.org/z/bRmUzz):
<source>: In lambda function:
<source>:11:36: error: declaration of 'data' shadows a member of 'Derived' [-Werror=shadow]
11 | auto lambda = [](const auto& data) {};
| ^
<source>:5:6: note: shadowed declaration is here
5 | int data;
| ^~~~
Почему это генерирует теневое предупреждение и как его предотвратить, не отключая-Wshadow
в целом? data
является закрытым в базовом классе! Объявление переменной-члена с именем data
в производном классе не приводит к такому предупреждению, как и ожидалось.