Il Clang documentation spiega perfettamente cheCostruttore predefinito dichiarato dall'utente + Inizializzatori in classe! = Costruttore fornito dall'utente?
Se una classe o struct ha alcun costruttore predefinito definito dall'utente, C++ non permetterà di default costruire un esempio const a come questo ([dcl.init] , p9)
Il razionale è che se un oggetto const non è inizializzato correttamente, non può essere modificato in seguito. Il seguente codice ha solo un dall'utente dichiarato costruttore di default perTest
, ma tutti i suoi membri hanno inizializzatori in-class,
#include<iostream>
class Test
{
public:
Test() = default;
void print() const { std::cout << i << "\n"; }
private:
int i = 42; // will propagate to the default constructor!
};
int main()
{
Test const t; // <-- Clang chokes on the const keyword, g++ does not
t.print(); // prints 42
}
così il razionale per dall'utente anche fornendo il costruttore predefinito sembra superfluo me . E infatti, g ++ 4.8.1 lo compila senza problemi (Online Example), anche se Clang < = 3.2 no.
Domande: perché la combinazione di initalizzatori completi in classe + costruttore predefinito dichiarato dall'utente non è sufficiente per creare un oggetto const predefinito? C'è una correzione in corso per lo standard C++ 14?
UPDATE: chiunque può provare su Clang 3.3/3.4 per vedere se questo è stato risolto rispetto al Clang 3.2?
Penso che questo sia un errore/bug in Clang, e g ++ è corretto per accettare il codice. –
@JerryCoffin Qualche citazione standard da seguire? Chiedo perché senza l'inizializzatore in classe, lo standard dice che Clang ha ragione. – TemplateRex
Non proprio una citazione, ma con N3337, la formulazione era già stata cambiata, quindi questa richiesta era scomparsa. Dato che * è * nello standard, suppongo che chiamarlo un errore o un bug sia probabilmente poco accurato, ma a questo punto penso che la maggior parte dei compilatori stiano ignorando il C++ 11 * di per sé * e che stiano cercando nuove bozze. –