c++ - ¿Por qué esto llama al constructor predeterminado?
syntax most-vexing-parse (3)
struct X
{
X() { std::cout << "X()/n"; }
X(int) { std::cout << "X(int)/n"; }
};
const int answer = 42;
int main()
{
X(answer);
}
Hubiera esperado que esto se imprimiera
-
X(int)
, porqueX(answer);
podría interpretarse como un lanzamiento deint
aX
, o - nada en absoluto, porque
X(answer);
podría interpretarse como la declaración de una variable.
Sin embargo, imprime X()
, y no tengo idea de por qué X(answer);
llamaría al constructor predeterminado.
PUNTOS DE BONIFICACIÓN: ¿Qué tendría que cambiar para obtener una declaración temporal en lugar de una variable?
nada en absoluto, porque X (respuesta); podría interpretarse como la declaración de una variable.
Tu respuesta está escondida aquí. Si declaras una variable, invocas su ctor predeterminado (si no es POD y todo eso).
En su edición: para obtener un temporal, tiene algunas opciones:
-
(X(answer));
-
(X)answer;
-
static_cast<X>(answer)
-
X{answer};
(C ++ 11) -
[]{ return X(answer); }();
(C ++ 11, puede incurrir en copia) -
void(), X(answer);
-
X((void(),answer));
-
true ? X(answer) : X();
-
if(X(answer), false){}
-
for(;X(answer), false;);
-
X(+answer);
Los paréntesis son opcionales. Lo que dijiste es idéntico a X answer;
, y es una declaración declaración.
Si quiere declarar una variable del tipo X, debe hacerlo de esta manera:
X y(answer);