Una de las verrugas de C (y C++ la hereda (y lo empeora)) es que no hay una sintaxis especial para presentar una declaración. Esto significa que las declaraciones a menudo se ven como código ejecutable. Otro ejemplo:
A * a;
¿Está esto multiplicando A por a, o está declarando algo? Para darle sentido a esta línea, debes saber que A es el nombre de un tipo.
La regla básica en C++ es que si algo se puede analizar como una declaración, lo es. En este caso, conduce a un resultado extraño y sorprendente. Las declaraciones de funciones se parecen mucho a las llamadas a funciones y, en particular, la (después de que A se puede pensar de dos maneras:
Puede solucionar esto en este ejemplo con paréntesis adicionales que eliminan la capacidad del compilador para analizar el código como una declaración.
B b((A(i)));
En C no es ambigua, porque no hay un estilo en función de llamada al constructor porque no hay constructores. una es el nombre de un tipo, o que es el nombre de una función . No puede ser ambos.
creo que también se podría do: B b = B (A (i)); – Bill
Sí, eso también funcionaría, es más fácil de entender y menos feo. :-) – Omnifarious
... pero significa una cosa diferente - 'B b = B (...)' requiere 'B' para tener un constructor de copia (aunque el compilador puede optimizar la llamada, sigue siendo necesario) para comprobar), mientras que 'B b (...)' no lo requiere. –