In-class initializers (funzione C++ 11) deve essere racchiuso tra parentesi graffe o seguire un segno =. Non possono essere specificati tra parentesi.Perché gli inizializzatori in classe possono utilizzare solo = o {}?
Qual è il motivo?
In-class initializers (funzione C++ 11) deve essere racchiuso tra parentesi graffe o seguire un segno =. Non possono essere specificati tra parentesi.Perché gli inizializzatori in classe possono utilizzare solo = o {}?
Qual è il motivo?
Non sono al 100% positivo, ma ciò potrebbe essere utile per evitare un'ambiguità di sintassi. Ad esempio, considerare la seguente classe:
class BadTimes {
struct Overloaded;
int Overloaded; // Legal, but a very strange idea.
int confusing(Overloaded); // <-- This line
};
Che cosa significa la riga indicata? Come scritto, si tratta di una dichiarazione di una funzione membro denominata confusing
che accetta come parametro un oggetto di tipo Overloaded
(il cui nome non è specificato nella dichiarazione della funzione) e restituisce uno int
. Se C++ 11 dovesse consentire agli inizializzatori di utilizzare le parentesi, ciò sarebbe ambiguo, perché potrebbe anche essere una definizione di un membro di tipo inizializzato sul valore del membro di dati Overloaded
. (. Questo è legato al problema corrente con il Most Vexing Parse)
Imponendo parentesi graffe, questa ambiguità viene rimosso:
class BadTimes {
struct Overloaded;
int Overloaded; // Legal, but a very strange idea.
int confusing{Overloaded}; // <-- This line
};
Ora, è chiaro che confusing
è in realtà un int
inizializzato al valore di Overloaded
, perché non c'è modo di leggerlo come una dichiarazione di funzione.
Spero che questo aiuti!
puoi spiegare in dettaglio perché "confondere" è definizione e non dichiarazione? ** "questa è una definizione di una funzione membro denominata confusione che accetta come parametro un oggetto di tipo Sovraccaricato" **. ho questa confusione perché dovrebbe essere ambigua, giusto? –
@ Koushik- Hai ragione, quella dovrebbe essere la dichiarazione, non la definizione. Lascia che ti aggiusti ... – templatetypedef