title: Most vexing parse
text: # 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:
  
  