В следующем примере:
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 имеют другой тип. Почему предупреждение?
Обновление
Я вижу, что существует широкое согласие того, что означает "тень". И с формальной точки зрения, компилятор делает точно, что он предназначен, чтобы сделать.
Однако, по моему скромному мнению, флаг не практичен. Например, наиболее часто используемая идиома метода set/метода считывания:
class A {
void prop(int prop); // setter
int prop() const; // getter
int prop;
};
Было бы хорошо, если бы был флаг предупреждения, который не будет предупреждение о проблемах в случае, но предупредит в случае, если "интервал" скрывает "интервал a".
Добавление-Wshadow на моем унаследованном коде выпускает тонны предупреждений, в то время как время от времени я обнаруживаю ошибки, вызванные проблемой "затенения".
Я не возражаю, как это назовут "-Wmuch_more_practical_and_interesting_shadow" или "-Wfoooooo".
Так, есть ли другие gcc предупреждение флагов, что делают то, что я описал?
Обновление 2
Я не единственный, кто думает, что-Wshadow является так или иначе не текстом полезной ссылки. Я не являюсь одним :) Менее строгая проверка могла быть намного более полезной.
Тот факт, что параметр имеет тип, отличный от типа функции-члена, не влияет на тот факт, что параметр затеняет функцию-член.
Почему вы ожидаете, что об этом не будет предупреждения?
Я не понимаю, почему вы настаиваете только на определенных типах слежки. Затенение - это затенение, и его опасности одинаковы, даже если типы разные, и даже если переменная затеняет функцию, как в вашем случае. Опасность затенения состоит в том, что код может делать что-то отличное от того, что хотел сделать его автор.
Это, кстати, легко может произойти, когда переменная затеняет функцию, поскольку в C ++ разница между ними намного тоньше, чем может показаться на первый взгляд.
Например, здесь переменная затеняет функцию
struct L {
void operator ()();
};
struct A {
void len();
A(L len) {
len();
// Intended to call the member function. Instead got a call to the functor
}
};
, и я думаю, что довольно очевидно, что из-за затенения код может делать то, что автор не собирался делать.
Он делает именно то, что написано на коробке. Предупреждает о слежке.
Внутри функции setLen
в области видимости находятся два символа с одинаковым именем.
len
- это имя параметра функции, а также имя функции.
Одно затеняет имя другого, поэтому, когда вы пишете код, который ссылается на len
, вы можете не получить желаемый результат. Поскольку вы попросили компилятор предупредить вас о том, что символы затеняют друг для друга, это то, о чем он вас предупреждает.