2012-12-22 9 views
18
struct Bar 
{ 
    Bar() {} 
}; 


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

int main() 
{ 
    Foo foo; 
} 

Przy użyciu C++ 11 default słowa kluczowego i gcc ostrzeżenie -Weffc++, GCC wyjścia:mogę zignorować gcc ostrzeżenie: 'Foo :: m_bar' powinno być inicjowane na liście inicjalizacji członkiem [-WeffC++]

ostrzeżenie: 'Foo :: m_bar' powinno być inicjowane na liście inicjalizacji członkiem [-WeffC++]

Czy można bezpiecznie zignorować to ostrzeżenie? Czy powinienem zgłosić błąd do gcc?

+2

"Należy zgłosić błąd do gcc" - nie. Kiedy myślisz, że to błąd kompilatora, to nie jest. –

+2

Nie widzę ostrzeżeń, jeśli robię "Bar() = default". – Pubby

+5

Szkoda, że ​​nie ma komentarzy do downwotowania ... – StoryTeller

Odpowiedz

27

Możesz zignorować lub wyłączyć ostrzeżenie. Jest to błędna interpretacja jednego z wytycznych Effective C++. Wytyczna mówi, że preferuje inicjalizację i przypisanie, ale w twoim przykładzie zostanie zainicjowany m_bar. Twój kod jest poprawny.

Źródło: Jonathan Wakely w GCC bug trackerze:

# Element 12: Wolę inicjalizacji do przypisania w konstruktorów.

Zastąpiony Punkt 4: „Upewnij się, że obiekty są inicjowane zanim oni używany” i G ++ misinterprets oryginalny element tak i ostrzega o żadnego członek bez MEM-inicjatora, co jest bardzo irytujące: nie ma sensu inicjowanie std :: string, , ma całkowicie bezpieczny domyślny konstruktor. Moja łatka -Wmeminit dla PR 2972 ​​powinna zastąpić bieżące ostrzeżenie dla tego elementu, , ponieważ ostrzega tylko o elementach pozostawionych niezainicjowanym przez konstruktor.

(I jak jest to znany problem, nie ma potrzeby, aby zgłosić to jako błąd ponownie.)

+2

Nic gorszego niż fałszywe alarmy ... –

5

Czy to w porządku, aby zignorować to ostrzeżenie? Tak.

Czy warto zignorować to ostrzeżenie? Zależy (*)

Czy należy zgłosić błąd do gcc?Nie (*)

(*)

  • default konstruktor w rzeczywistości Zainicjowanie m_bar dobrze, można przetestować tę
  • to trochę dziwne, że g ++ nie dostać, że
  • wybrano bardzo verbose warning setting
  • ostrzeżenie nie dotyczy poprawności kodu, raczej stylu
  • nie można tego skorygować i zachować domyślny konstruktor dla Foo i niestandardowego constructo r na pasku

man g++ sekcja -WeffC++

Informuj o łamanie następujących wytycznych styl z Scott Meyers' Efektywne C++ książki:

  • Punkt 11: Zdefiniuj konstruktor kopiujący i operator przypisania dla klas z dynamicznie przydzieloną pamięcią.
  • Artykuł 12: Preferuj inicjalizację do przypisania w konstruktorze.
  • Artykuł 14: Wykonuj wirtualne destruktory w klasach bazowych.
  • Artykuł 15: "operator =" zwraca odwołanie do * tego.
  • Artykuł 23: Nie próbuj zwracać odniesienia, gdy musisz zwrócić obiekt.

ostrzegają również o łamanie następującymi wytycznymi stylu z więcej Effective ++ książki Scott Meyers’ C:

  • pozycja 6: Należy rozróżnić między prefiks i Postfix form inkrementacja.
  • Pozycja 7: Nigdy nie przeciążaj "& &", "││" lub ",".

Po wybraniu tej opcji należy pamiętać, że standardowe nagłówki bibliotek nie są zgodne z tymi wszystkimi wytycznymi.