gcc-Wshadow слишком строг?

В следующем примере:

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 является так или иначе не текстом полезной ссылки. Я не являюсь одним :) Менее строгая проверка могла быть намного более полезной.

16
задан portforwardpodcast 26 May 2019 в 10:51
поделиться

3 ответа

Тот факт, что параметр имеет тип, отличный от типа функции-члена, не влияет на тот факт, что параметр затеняет функцию-член.

Почему вы ожидаете, что об этом не будет предупреждения?

16
ответ дан 30 November 2019 в 15:25
поделиться

Я не понимаю, почему вы настаиваете только на определенных типах слежки. Затенение - это затенение, и его опасности одинаковы, даже если типы разные, и даже если переменная затеняет функцию, как в вашем случае. Опасность затенения состоит в том, что код может делать что-то отличное от того, что хотел сделать его автор.

Это, кстати, легко может произойти, когда переменная затеняет функцию, поскольку в 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
  }
};

, и я думаю, что довольно очевидно, что из-за затенения код может делать то, что автор не собирался делать.

9
ответ дан 30 November 2019 в 15:25
поделиться

Он делает именно то, что написано на коробке. Предупреждает о слежке.

Внутри функции setLen в области видимости находятся два символа с одинаковым именем. len - это имя параметра функции, а также имя функции.

Одно затеняет имя другого, поэтому, когда вы пишете код, который ссылается на len , вы можете не получить желаемый результат. Поскольку вы попросили компилятор предупредить вас о том, что символы затеняют друг для друга, это то, о чем он вас предупреждает.

7
ответ дан 30 November 2019 в 15:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: