В следующем примере:
class A
{
public:
int len();
void setLen(int len) { len_ = len; } // warning at this line
private:
int len_;
};
gcc с -Wshadow выдает предупреждение:
main.cpp:4: warning: declaration of `len' shadows a member of `this'
Функция len и целое число len имеют разные типы. Почему предупреждение?
Обновление
Я вижу, что существует широкое согласие относительно того, что означает "тень".
И с формальной точки зрения компилятор делает именно то, для чего он предназначен.
Однако ИМХО флаг не практичен. Например, часто используемые идиомы setter / getter:
class A {
void prop(int prop); // setter
int prop() const; // getter
int prop;
};
Было бы хорошо, если бы был флаг предупреждения, который не будет выдавать предупреждение в этом случае, но будет предупреждать в случае, если "int a" скрывает "int a".
Добавление -Wshadow в моем устаревшем коде выдает массу предупреждений, в то время как время от времени я обнаруживаю ошибки, вызванные проблемой "shadowing".
Я не против, как это будет называться "-Wmuch_more_practical_and_interesting_shadow" или
"-Wfoooooo".
Итак, есть ли другие флаги предупреждения gcc, которые делают то, что я описал?
Обновление 2
Я не единственный, кто думает - Тень как-то бесполезна текст ссылки . Я не одинок :)
Менее строгая проверка может быть гораздо полезнее.