Могу ли я игнорировать предупреждение 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?
Ответы
Ответ 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: Никогда не перегружайте "& &", "││" или ",".
При выборе этой опции имейте в виду, что стандартные заголовки библиотек не подчиняются всем этим рекомендациям.