Почему gcc предупреждает, когда лямбда-параметр скрывает закрытый член базового класса - PullRequest
1 голос
/ 26 октября 2019

При включении -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 в производном классе не приводит к такому предупреждению, как и ожидалось.

...