Considerate questo:
float foo(int())
Questo dichiara una funzione foo
(accettando una funzione che restituisce int
) ritorno float
.
ora Saperne
Y y(X());
come y
come la funzione (accettando una funzione che restituisce X
) tornando Y
Il problema sorge a causa di C++ most vexing parse
può essere risolto con:
Y y{ X() }; // requires C++11
o
Y y((X()));
//^ ^notice parenthesis
Aggiornamento sulla base di edit:
Un citazione da standard:
§ 8.2 risoluzione ambiguità [dcl.ambig.res]
1 - L'ambiguità derivante dalla somiglianza tra un cast di tipo funzione e una dichiarazione menzionata in 6.8 può anche verificarsi nel contesto di una dichiarazione. In questo contesto, la scelta è tra una dichiarazione di funzione con un insieme ridondante di parentesi attorno al nome di un parametro e una dichiarazione di oggetto con un cast di stile funzione come inizializzatore. Come per le ambiguità menzionate in 6.8, la risoluzione è considerare qualsiasi costrutto che potrebbe essere una dichiarazione una dichiarazione. [Nota: una dichiarazione può essere esplicitamente disambigua da un cast non funzionale, da a = per indicare l'inizializzazione o rimuovendo le parentesi ridondanti attorno al nome del parametro. ]
[Example:
struct S {
S(int);
};
void foo(double a)
{
S w(int(a)); // function declaration
S x(int()); // function declaration
S y((int)a); // object declaration
S z = int(a); // object declaration
}
—end example]
Analogamente altri esempi seguendo questo.
Questo non è un bug del compilatore. È il problema di parse più irritante, astutamente camuffato. – Bathsheba
Votato per riaprire in base alla modifica: una citazione dallo standard sarebbe effettivamente utile. 6.8 parla di dichiarazioni di espressioni disamorose e dichiarazioni, ma l'analisi più irritante è in realtà un'ambiguità tra due dichiarazioni. – Angew