В следующем примере:
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 в мой унаследованный код приводит к появлению множества предупреждений, в то время как время от времени я обнаруживаю ошибки, вызванные проблемой "теневого копирования".
Я не против, как это будет называться "-Wmuch_more_practical_and_interesting_shadow" или "-Wfoooooo".
Итак, есть ли другие флаги предупреждения gcc, которые делают то, что я описал?
Обновление 2
Я не единственный, кто считает -Wshadow каким-то образом бесполезным текстом ссылки. Я не одинок :) Менее строгие проверки могут быть гораздо полезнее.