2009-07-13 14 views
28

Recientemente me encontré con alguna clase de aspecto extraño que tenía tres constructores:¿Palabra clave explícita en el constructor multi-arg?

class Class 
{ 
    public: 
     explicit Class(int); 

     Class(AnotherClass); 

     explicit Class(YetAnotherClass, AnotherClass); 

    // ... 
} 

Esto no tiene mucho sentido para mí - pensé que la palabra clave explícita es la de proteger la construcción elegido compilador de un tipo extraño.

¿Esto está permitido? Si es así, ¿qué significa?

+0

este duplicado obtuvo más/mejores respuestas: [¿Por qué se permite explícitamente a los constructores y constructores predeterminados con 2 o más parámetros (no predeterminados)?] (Https://stackoverflow.com/questions/4467142/why-is- explicit-allowed-for-default-constructors-and-constructors-with-2-or-more) –

Respuesta

46

En C++ 11 los constructores de múltiples parámetros se pueden convertir implícitamente con la inicialización de llaves.

Sin embargo, antes de C++ 11 explicit solo se aplicaba a los constructores de argumento único. Para los constructores de argumentos múltiples, fue ignorado y had no effect.

+1

Gracias por aclarar. Me imagino que GCC advertiría en tal ocasión. – LiraNuna

+26

Con la advertencia de que si todos menos uno de los params multi-arg tienen valores predeterminados, entonces tendrá un efecto – zebrabox

+20

Esto ha cambiado con C++ 11. Ahora los constructores de parámetros múltiples se pueden convertir implícitamente con la inicialización de llaves. – Shane