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


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

int main() 
{ 
    Foo foo; 
} 

Quando si usa C++ 11 default parola chiave e di allarme gcc -Weffc++, uscite gcc:Posso ignorare l'avviso gcc: 'Foo :: m_bar' deve essere inizializzato nella lista di inizializzazione di membri [-WeffC++]

avvertimento: 'Foo :: m_bar' deve essere inizializzato nella lista di inizializzazione di membri [-WeffC++]

è sicuro ignorare questo avviso? Devo presentare un bug a gcc?

+2

"Devo segnalare un errore a gcc" - no. Quando pensi che sia un bug del compilatore, allora non lo è. –

+2

Non vedo gli avvisi se faccio 'Bar() = default'. – Pubby

+5

Peccato che non ci siano commenti di downvoting ... – StoryTeller

risposta

27

È possibile ignorare o sopprimere l'avviso. Questa è un'interpretazione errata di una delle linee guida efficaci di C++. La linea guida dice di preferire l'inizializzazione all'assegnazione, ma nel tuo esempio, m_bar verrà inizializzato. Il tuo codice è corretto

Fonte: Jonathan Wakely nel bug tracker di GCC:

Articolo # 12: Preferisco inizializzazione assegnazione nei costruttori.

sostituito da punto 4: "Assicurarsi che gli oggetti vengono inizializzati prima che siano usato", e G ++ interpreta l'elemento originale in ogni caso e mette in guardia circa qualsiasi membro senza un mem-inizializzatore, che è molto fastidioso: non c'è il punto inizializzando uno std :: string, ha un costruttore di default perfettamente sicuro. La mia patch -Wememinit per PR 2972 ​​dovrebbe sostituire l'avviso corrente per questo elemento, in quanto avverte solo sui membri non inizializzati dal costruttore.

(E come si tratta di un problema noto, non c'è bisogno di segnalarlo come un bug di nuovo.)

+2

Niente di peggio dei falsi positivi ... –

5

E 'bene a ignorare questo avviso? Sì.

È una buona idea ignorare questo avviso? Depends (*)

Si dovrebbe presentare un errore a gcc?No (*)

(*)

  • default costruttore infatti inizializza m_bar bene, è possibile verificare che
  • un po 'strano che g ++ non ottiene che
  • è stata selezionata molto impostazione di avviso verbale
  • avviso non è sulla correttezza del codice, piuttosto sullo stile
  • non è possibile correggere questo e mantenere il costruttore predefinito per Foo e costrutto personalizzato r per Bar

man g++, sezione -WeffC++

mettere in guardia circa le violazioni delle seguenti linee guida dello stile da Scott Meyers' libro Effective C++:

  • Articolo 11: Definire un costruttore di copia e un operatore di assegnazione per le classi con memoria allocata dinamicamente.
  • Elemento 12: Preferire l'inizializzazione all'assegnazione nei costruttori.
  • Item 14: Rendi virtuali i distruttori nelle classi base.
  • Elemento 15: "operatore =" restituisce un riferimento a * questo.
  • Elemento 23: non tentare di restituire un riferimento quando è necessario restituire un oggetto.

mettere in guardia anche su violazioni delle seguenti linee guida dello stile da Scott Meyers’ più efficace libro C++:

  • Articolo 6: Distinguere tra prefisso e suffisso forme di operatori di incremento e decremento.
  • Elemento 7: non sovraccaricare mai "& &", "││" o ",".

Quando si seleziona questa opzione, tenere presente che le intestazioni di libreria standard non rispettano tutte queste linee guida.

Problemi correlati