Я недавно начал использовать «Уровень предупреждения 4» и обрабатывать предупреждения как ошибки при кодировании в C ++.Я хотел бы получить более подробную информацию о следующем фрагменте:
struct Foo
{
Foo(int size)
//:size{ size } // <- More on this later.
{
this->size = size;
}
void func(int size)
{
this->size = size;
}
int size;
};
int main()
{
Foo a{ 1 };
a.func(2);
}
Итак, я получаю следующее предупреждение / ошибку из Visual Studio 2019:
Ошибка: C2220 - Предупреждение обрабатывается как ошибка - файл объекта не создан.
Предупреждение: C4458 - Объявление размера указывает член класса.
Предупреждение указывает, что size
член скрыт параметром метода, который также называется size
.Вывод указывает, что ошибка не из конструктора, а из метода func
.Я нахожу это непонятным, так как конструктор, похоже, не имеет этой проблемы (действительно, удаление func
позволяет компилировать фрагмент).
Понижение уровня предупреждения позволяет приложению компилироваться, и кажется, чтоработать как задумано.Использование списка инициализаторов вместо тела конструктора (см. Закомментированную строку) также, похоже, работает, но я предполагаю, что это связано с семантикой списка инициализаторов.
Я понимаю, что ошибка говорит о том, что имя параметра size
из func
конфликтует с Foo
членом с тем же именем, но разве ключевое слово this
не должно устранить эту путаницу?Это просто слишком строгий компилятор Microsoft?