Il seguente codice compilato ed eseguito in gcc 4.9.1 e clang-3.6 utilizzando -std = C++ 11:Inizializzazione statica matrice membro constexpr in gcc 4.8
struct Bar
{
int x;
};
struct Foo
{
static constexpr Bar bars[] = {1, 2, 3};
};
constexpr Bar Foo::bars[];
Tuttavia, non riesce a gcc 4.8.3, con conseguente messaggio di errore
./cpptest.cpp:14:43: error: could not convert '1' from 'int' to 'const Bar'
static constexpr Bar bars[] = {1, 2, 3};
^
./cpptest.cpp:14:43: error: could not convert '2' from 'int' to 'const Bar'
./cpptest.cpp:14:43: error: could not convert '3' from 'int' to 'const Bar'
per inciso, se faccio la stessa cosa ma fare bars
una matrice globale static const, si compila bene in gcc 4.8 e clang. Compilerà anche bene se io copro tutti i letterali interi della lista con una coppia extra di {}
.
Quindi questo è un bug in gcc 4.8? Che cosa dice lo standard è la sintassi appropriata per questo? Quale parte dello standard di inizializzazione uniforme del C++ 11 viene invocato quando ometto le parentesi graffe?
Modifica: Sembra che lo standard indichi che questo dovrebbe richiamare l'inizializzazione di aggregazione, che dovrebbe consentire "brace elision". Quindi sembra che sia un bug in gcc 4.8, che è stato corretto da gcc 4.9, ma non sono affatto sicuro della mia lettura dello standard. Anche io non riesco a trovare alcun bug report nel bug tracker di gcc su questo, quindi potrei facilmente sbagliare.
Hai considerato un errore risolto? – edmz