Stavo scrivendo del codice oggi e ho ottenuto uno strano errore di compilazione, che sembra essere causato dall'inizializzazione delle variabili membro in un ordine diverso da quello in cui sono state dichiarate.Perché dovrei inizializzare le variabili membro nell'ordine in cui sono dichiarate?
Esempio:
class Test {
int a;
int b;
public:
Test() : b(1), a(2) {
}
};
int main() {
Test test;
return 0;
}
Poi se compilo con -Werror -Wall
:
$ g++ -Werror -Wall test.cpp
test.cpp: In constructor ‘Test::Test()’:
test.cpp:3:9: error: ‘Test::b’ will be initialized after [-Werror=reorder]
test.cpp:2:9: error: ‘int Test::a’ [-Werror=reorder]
test.cpp:6:5: error: when initialized here [-Werror=reorder]
cc1plus: all warnings being treated as errors
mi rendo conto che -Wall
chiede esplicitamente GCC andare over-the-top con avvisi, ma suppongo ci sia una ragione per tutti loro. Quindi, come potrebbe essere importante l'ordine di inizializzazione delle variabili dei membri?
-Werror, come indicano i messaggi, indica al compilatore di considerare tutti gli avvisi come errori. Il codice come scritto è valido e il suo significato è ben definito (sebbene ci siano ragionevoli argomenti per non scriverlo in quel modo), ma con -Werror, il compilatore non è conforme allo standard perché rifiuta di compilare un codice valido. –