2013-07-05 19 views
13

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?

+2

Penso che questo sia un errore/bug in Clang, e g ++ è corretto per accettare il codice. –

+0

@JerryCoffin Qualche citazione standard da seguire? Chiedo perché senza l'inizializzatore in classe, lo standard dice che Clang ha ragione. – TemplateRex

+1

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. –

risposta

Problemi correlati