Recentemente ho scoperto uno strano comportamento di clang e gcc. Ho uno struct (MyClass
), che utilizza l'inizializzazione in-class per uno dei suoi membri (active
):Perché clang e gcc gestiscono l'inizializzazione forzata delle strutture con l'inizializzazione in-class in modo diverso?
struct MyClass {
int something;
bool active = true;
};
Ora cerco di brace inizializzare di questa classe.
Utilizzando clang, posso decidere se includere active
nell'elenco di inizializzazione (MyClass a = { 42, true};
) o meno (MyClass a = { 42 };
).
Tuttavia, utilizzando gcc, il mio codice viene compilato solo se non includo active
. Altrimenti, verrà visualizzato il seguente errore del compilatore:
error: could not convert ‘{42, true}’ from ‘<brace-enclosed initializer list>’ to ‘MyClass’
È un errore? Cosa dice lo standard al riguardo? Che dire di VSC++? Quale strada consiglieresti come soluzione portatile?
Testato utilizzando gcc 4.9 e clang 3.5 su Debian Linux.
Stai compilando in modalità C++ 14 per entrambi? – juanchopanza
Sì, lo so. Ho anche abilitato tutti gli avvisi '-Wall', ma non ne ho ricevuto uno. – user3684240
In C++ 11 una classe con [inizializzatori di membri in-classe non statici non è un aggregato] (http://stackoverflow.com/q/27118535/1708801) e quindi non funzionerà in modalità C++ 11 ma dovrebbe riuscire in modalità C++ 14 per entrambi. Come noto nella mia [risposta] (http://stackoverflow.com/a/27118551/1708801) alla domanda collegata gcc non ha supportato questo fino alla 5.0. –