Most vexing parse
# Most vexing parse

Il most vexing parse è una forma di soluzione di ambiguità sintattica del C++, definita nella sezione 8.2 dello standard., determinata dal fatto che la sintassi per l'inizializzazione di una variabile è in alcuni casi ambigua con quella di dichiarazione di una funzione. La locuzione most vexing parse è stata introdotta da Scott Meyers in Effective STL (2001).

## Esempio con classi e oggetti

Il seguente è un esempio di dichiarazione o definizione ambigua:

La riga

potrebbe essere interpretata come

* la definizione di una variabile time_keeper di classe TimeKeeper, inizializzata con un'istanza anonima della classe Timer;
* la dichiarazione di una funzione time_keeper con tipo di ritorno TimeKeeper e un singolo parametro (senza nome) di tipo puntatore a funzione senza parametri e con tipo di ritorno Timer.

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:

in quanto time_keeper è una funzione dichiarata alla riga precedente, per cui non è possibile chiamare su essa il metodo get_time.

Clang++ fornisce un messaggio di warning:

Per fare in modo che l'istruzione venga interpretata come definizione di variabile con inizializzazione, è possibile aggiungere una coppia di parentesi supplementare:

## 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

In questo caso, i viene interpretata come una definizione di funzione, equivalente alla seguente

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

oppure si può usare l'opportuno operatore di casting del C++

## Uniform initialization syntax

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:

