2011-07-21 13 views
15

En el siguiente código, ¿por qué el compilador no se queja de mClass2?C++ - ¿Qué está haciendo esto si el constructor es privado?

class CMyClass{ 
private: 
    CMyClass(){} 
}; 

void TestMethod(){ 
    CMyClass mClass1; //Fails. 
    CMyClass mClass2(); //Works. 
} 
+0

relacionados http://stackoverflow.com/questions/4296090/some-problems-while-learning-stl/4296118#4296118 –

+1

También conocido como: más acuciantes Parse (ver http: // en. wikipedia.org/wiki/Most_vexing_parse) –

Respuesta

16

Debido a que usted ha acaba de declarar una función mClass2 de cero argumentos que devuelve un CMyClass. Esa es una opción válida ya que podría existir, por ejemplo, una instancia static CMyClass a la que esa función tenga acceso. Tenga en cuenta que CMyClass todavía tiene un constructor de copia pública.

(Para convencerse, compilar este módulo al ensamblador y observe que comentando la línea CMyClass mClass2(); produce el mismo resultado.)

+1

Además, un constructor de movimiento válido. – Arafangion

+0

Muchas gracias. :) – R4D4

10

Debido a que está declarando una función y no una llamada al constructor como usted piensa.

Esto se llama como Most Vexing Parse en C++.

CMyClass mClass2(); 

declara una función que toma mClass2() ningún parámetro y devuelve CMyClass

+0

** El análisis más fastidioso ** - No puedo decir que haya oído hablar de eso antes, voy a echarle un vistazo a eso, gracias. :) – R4D4

+0

@ R4D4: Se agregó un enlace para que pueda consultar :) –

1

La segunda es una declaración de la función.

Cuestiones relacionadas