Una delle verruche di C (e C++ la eredita (e lo rende peggiore)) è che non esiste una sintassi speciale per l'introduzione di una dichiarazione. Ciò significa che le dichiarazioni spesso assomigliano al codice eseguibile. Un altro esempio:
A * a;
È questo moltiplicando A di a, o sta dichiarando qualcosa? Per dare un senso a questa linea devi sapere che A è il nome di un tipo.
La regola di base in C++ è che se qualcosa può essere analizzato come una dichiarazione, lo è. In questo caso porta a un risultato strano e sorprendente. Le dichiarazioni delle funzioni assomigliano molto alle chiamate di funzione, in particolare la (dopo la A può essere pensata in un paio di modi.
È possibile aggirare questo in questo esempio con parentesi aggiuntiva che rimuove la capacità del compilatore di analizzare codice come una dichiarazione.
B b((A(i)));
In C questo non è ambiguo, perché non c'è uno stile funzione della chiamata al costruttore perché non ci sono i costruttori. una è il nome di un tipo, o è il nome di una funzione Non può essere entrambi.
io credo che si potrebbe anche do: B b = B (A (i)); – Bill
Sì, funzionerebbe anche, è più facile da capire e meno brutto. :-) – Omnifarious
... ma significa una cosa diversa - 'B b = B (...)' richiede 'B' di avere un costruttore di copia (anche se il compilatore può ottimizzare la chiamata ad esso, è ancora necessario per controllare), mentre 'B b (...)' non lo richiede. –