Si consideri il seguente codice:Questo comportamento non definito o un falso avviso positivo?
class A {
private:
int a;
public:
A(int a) : a(a) { }
};
class B : public A {
private:
int b;
bool init() {
b = 0;
return true;
}
public:
// init() is a hack to initialize b before A()
// B() : b(0), A(b) {} yields -Wreorder
// B() : A((b = 0)) {} no warning (but this one doesn't work so well with non-pod (pointer) types)
B() : A(init() ? b : 0) {}
};
Ora si cerca di compilare il codice con clangore ...
$ clang++ test.cpp -fsyntax-only
test.cpp:19:20: warning: field 'b' is uninitialized when used here [-Wuninitialized]
B() : A(init() ? b : 0) {}
^
1 warning generated.
GCC non stampa eventuali avvisi, nemmeno con -Wall -Wextra
e -pedantic
.
Perché 'B :: init' restituisce un valore costante? Suggerisco di dichiararlo "void". Non ha senso avere una funzione che restituisce un valore costante che non è determinato dal contenuto all'interno della funzione. –
@ThomasMatthews: È un esempio ridotto del mio vero codice, '(void) a' era solo un tentativo di silenziare' -Wunused-private-field'. – Thomas
@ThomasMatthews - basato sulla natura astratta di questo esempio, è ragionevolmente sicuro assumere che 'B :: init' restituisce una costante fa parte della creazione di [MVCE] (http://stackoverflow.com/help/mcve). –