Подтвердить что ты не робот

Могу ли я игнорировать предупреждение gcc: "Foo:: m_bar должен быть инициализирован в списке инициализации члена [-WeffС++]

struct Bar
{
    Bar() {}
};


struct Foo
{
    Foo() = default;
    Bar m_bar;
};

int main()
{
    Foo foo;
}

При использовании ключевого слова С++ 11 default и gcc warning -Weffc++, выходы gcc:

предупреждение: 'Foo:: m_bar должен быть инициализирован в члене список инициализации [-WeffС++]

Можно ли игнорировать это предупреждение? Должен ли я записывать ошибку в gcc?

4b9b3361

Ответ 1

Вы можете игнорировать или подавлять предупреждение. Это неправильное толкование одного из эффективных рекомендаций С++. В директиве предпочтение отдается назначению, но в вашем примере будет инициализирован m_bar. Правильный код.

Источник: Джонатан Вакели в отслеживателе ошибок GCC:

# Пункт 12: Предположим инициализацию назначения в конструкторах.

Заменено пунктом 4: "Убедитесь, что объекты инициализированы до того, как они используется", а g++ неверно истолковывает исходный элемент и предупреждает о любых член без mem-инициализатора, что очень раздражает: нет смысла инициализируя std::string, он имеет совершенно безопасный конструктор по умолчанию. мой Патч Wmeminit для PR 2972 ​​должен заменить текущее предупреждение для этого элемента, поскольку он только предупреждает о членах, которые не инициализируются конструктором.

(И поскольку это известная проблема, нет необходимости сообщать об этом как об ошибке снова.)

Ответ 2

Можно ли игнорировать это предупреждение? Да.

Можно ли игнорировать это предупреждение? Зависит (*)

Должен ли файл указать gcc? Нет (*)

(*)

  • default конструктор фактически инициализирует m_bar просто отлично, вы можете проверить, что
  • немного странно, что g++ не получает этого
  • вы выбрали очень подробное предупреждение о настройке
  • предупреждение не о правильности вашего кода, а о стиле
  • вы не можете исправить это и сохранить конструктор по умолчанию для Foo и настраиваемого конструктора для Bar

man g++, раздел -WeffС++

Предупреждать о нарушениях следующих стилей руководства от Скотта Майера Эффективная книга на С++:

  • Пункт 11: Определите конструктор копирования и оператор присваивания для классов с динамически распределенной памятью.
  • Пункт 12: Предположим инициализацию назначения в конструкторах.
  • Пункт 14: Сделать деструкторы виртуальными в базовых классах.
  • Пункт 15: "operator =" возвращает ссылку на это.
  • Пункт 23: Не пытайтесь вернуть ссылку, когда вы должны вернуть объект.

Также предупреждайте о нарушениях следующих правил стиля от Скотта Мейерса. Более эффективная книга на С++:

  • Пункт 6: Различать префиксные и постфиксные формы операторов инкремента и декремента.
  • Пункт 7: Никогда не перегружайте "& &", "││" или ",".

При выборе этой опции имейте в виду, что стандартные заголовки библиотек не подчиняются всем этим рекомендациям.