Most vexing parse: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
m Bot: passaggio degli url da HTTP a HTTPS |
m tag source deprecati, replaced: <source lang= → <syntaxhighlight lang= (9), </source> → </syntaxhighlight> (9) |
||
Riga 10:
== Esempio con classi e oggetti ==
Il seguente è un esempio di dichiarazione o definizione ambigua:
<
class Timer {
public:
Riga 27:
return time_keeper.get_time();
}
</syntaxhighlight>
La riga
<
TimeKeeper time_keeper(Timer());
</syntaxhighlight>
potrebbe essere interpretata come
# la definizione di una [[variabile (informatica)|variabile]] {{Code|time_keeper}} di classe {{Code|TimeKeeper}}, inizializzata con un'istanza anonima della classe {{Code|Timer}};
Riga 38:
Lo standard richiede di interpretare questa riga nella seconda maniera, per cui la riga successiva non sarà valida. Ad esempio, [[g++]] restituisce il seguente messaggio di errore:
<
$ g++ -c time_keeper.cc
time_keeper.cc: In function ‘int main()’:
time_keeper.cc:15: error: request for member ‘get_time’ in ‘time_keeper’, which is
of non-class type ‘TimeKeeper(Timer (*)())’
</syntaxhighlight>
in quanto {{Code|time_keeper}} è una funzione dichiarata alla riga precedente, per cui non è possibile chiamare su essa il metodo {{Code|get_time()}}.
Riga 62:
Per fare in modo che l'istruzione venga interpretata come definizione di variabile con inizializzazione, è possibile aggiungere una coppia di parentesi supplementare:
<
TimeKeeper time_keeper( (Timer()) );
</syntaxhighlight>
== Esempio con cast funzionale ==
Un altro esempio coinvolge l'uso del cast funzionale, quando viene usato per convertire il valore di un'espressione passata poi come variabile o come parametro di un costruttore
<
void f(double adouble) {
int i(int(adouble));
}
</syntaxhighlight>
In questo caso, {{code|i}} viene interpretata come una definizione di funzione, equivalente alla seguente
<
// takes an integer and returns an integer
int i(int adouble);
</syntaxhighlight>
Per disambiguare l'espressione affinché venga interpretata come dichiarazione di variabile, si può usare la stessa tecnica dell'esempio precedente, oppure si può sostituire il cast funzionale con un cast in stile C
<
// declares a variable called 'i'
int i((int) adouble);
</syntaxhighlight>
oppure si può usare l'opportuno operatore di casting del C++
<
// declares a variable called 'i'
int i(static_cast<int>(adouble));
</syntaxhighlight>
== Uniform initialization syntax ==
Riga 100:
Lo standard [[C++11]] ha introdotto la ''uniform initialization syntax'' (sintassi di inizializzazione uniforme), che uniforma la sintassi per l'inizializzazione di oggetti o variabili con quella per gli array e permette di evitare ogni ambiguità con la dichiarazione di funzioni. La riga problematica del primo esempio può essere riscritta come:
<
TimeKeeper time_keeper{Timer{}};
</syntaxhighlight>
== Note ==
|