Most vexing parse: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
LauBot (discussione | contributi)
m Bot: passaggio degli url da HTTP a HTTPS
ValterVBot (discussione | contributi)
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:
<sourcesyntaxhighlight lang="cpp">
class Timer {
public:
Riga 27:
return time_keeper.get_time();
}
</syntaxhighlight>
</source>
 
La riga
<sourcesyntaxhighlight lang="cpp">
TimeKeeper time_keeper(Timer());
</syntaxhighlight>
</source>
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:
<sourcesyntaxhighlight lang="console">
$ 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>
</source>
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:
<sourcesyntaxhighlight lang="cpp">
TimeKeeper time_keeper( (Timer()) );
</syntaxhighlight>
</source>
 
== 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
 
<sourcesyntaxhighlight lang="cpp">
void f(double adouble) {
int i(int(adouble));
}
</syntaxhighlight>
</source>
 
In questo caso, {{code|i}} viene interpretata come una definizione di funzione, equivalente alla seguente
 
<sourcesyntaxhighlight lang="cpp">
// takes an integer and returns an integer
int i(int adouble);
</syntaxhighlight>
</source>
 
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
 
<sourcesyntaxhighlight lang="cpp">
// declares a variable called 'i'
int i((int) adouble);
</syntaxhighlight>
</source>
 
oppure si può usare l'opportuno operatore di casting del C++
 
<sourcesyntaxhighlight lang="cpp">
// declares a variable called 'i'
int i(static_cast<int>(adouble));
</syntaxhighlight>
</source>
 
== 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:
 
<sourcesyntaxhighlight lang="cpp">
TimeKeeper time_keeper{Timer{}};
</syntaxhighlight>
</source>
 
== Note ==