funcion c++ constructor most-vexing-parse

funcion - C++ spooky constructor



funcion union c++ (6)

Posible duplicado:
¿Por qué es un error usar un conjunto vacío de corchetes para llamar a un constructor sin argumentos?

Permite tener este código

class Foo { Foo(int) { } };

Entonces tenemos resultados allí:

int main() { Foo f1 = Foo(5); // 1: OK, explicit call Foo f2(5); // 2: OK, implicit call Foo f3(); // 3: no error, "f3 is a non-class type Foo()", how so? Foo f4(f1); // 4: OK, implicit call to default copy constructor Foo f5; // 5: expected error: empty constructor missing }

¿Puedes explicar qué está pasando en el caso 3 ?


C ++ tiene una regla de que si una declaración se puede interpretar como una declaración de función, se interpreta de esta manera.

De ahí la sintaxis Foo f3(); en realidad declara una función que no toma argumentos y devuelve Foo . Trabaja esto escribiendo Foo f3; , llamará al constructor predeterminado también (si hay uno, por supuesto).


Esto no es lo que crees que es:

Foo f3();

Puede pensar que esta es una llamada explícita del constructor predeterminado, pero no lo es. En realidad, es una declaración de una función llamada f3 que no toma parámetros y devuelve un Foo por valor.

Que esto se analice como una declaración de función en lugar de una llamada de constructor se conoce como el Parseo más irritante .


Has definido una función llamada f3 que devuelve un foo en el caso 3. En el caso 5, no tienes definido un constructor predeterminado, por lo que obtienes un error.


La tercera línea se analiza como declarando una función que no toma ningún argumento y devuelve un Foo .


Foo f3(); declara una función llamada f3 , con un tipo de retorno de Foo .


  • f1 invoca el constructor de copia después de una llamada explícita, estabas equivocado en este
  • f2 es una llamada explícita al constructor // también te equivocaste aquí
  • f3 declara una función
  • f4 es nuevamente el constructor de copia, como f1 // estás aquí
  • f5 llamaría al constructor predeterminado // estás aquí mismo otra vez