2012-01-04 18 views
9

Me sorprendió encontrar que en VC++ 10, se puede utilizar un typedef para cambiar el nombre del constructor de una clase:¿El estándar de C++ permite usar un typedef para cambiar el nombre de un constructor?

#include <iostream> 

using namespace std; 

class A 
{ 
private: 
    typedef A alias; 

public: 
    alias() { cout << "A ctor" << endl; } 
}; 

int main() 
{ 
    A(); // prints "A ctor" 
    return 0; 
} 

¿Este estándar de C++ o una extensión de Microsoft?

+0

No estoy seguro en el estándar, pero g ++ y clang ++ ambos errores en este código. –

+0

g ++ devuelve 'ISO C++ prohíbe la declaración de 'alias' sin tipo' – dasblinkenlight

Respuesta

11

No; los constructores no tienen un nombre. No puede tomar la dirección de un constructor o pasar un puntero a la función, o simplemente llamar al como una función normal. La sintaxis A::A() es solo una sintaxis especial del declarador que le permite declarar y definir los constructores, pero no es un nombre .

Dicho esto, no se puede typedef objetos (incluyendo los punteros de función) de todos modos, sólo tipos.

Para hacer comentarios sobre el comportamiento MSVC, cito de 12.1/3:

Un typedef-nombre no se utilizará [...] de que se declare constructor.

Cuestiones relacionadas