2011-09-19 9 views
7

En un GoogleTechTalks video on Youtube, Bjarne Stroustrup habla sobre el próximo estándar C++ 0x. En el video se menciona el siguiente ejemplo:¿Este ejemplo del uso de la palabra clave "explícita" de C++ es correcto?

#include <iostream> 

struct Sick 
{ 
    Sick(double d)  { std::cout << d << "\n"; } 
    explicit Sick(int i) { std::cout << i << "\n"; } 
}; 


int main() 
{ 
    Sick s1 = 2.1; 
    Sick s2(2.1); 
} 

¿Se refería a colocar la palabra clave antes de explicitSick(double) en lugar de Sick(int), con el fin de poner de relieve los problemas asociados con las conversiones implícitas en ciertos contextos?

+3

¿Cómo se supone que debemos saber qué quiere decir alguien en un video de youtube? Lo importante es que * usted * entiende el uso de 'explicit' en este ejemplo. –

+2

Cualquiera de los dos sería razonable, dependiendo de lo que quiera mostrar con el ejemplo. – Flexo

+3

@Kerrek SB, se supone que debes saber a qué se refería porque está tratando de comunicar lo que quiso decir. – ikegami

Respuesta

9

En su discusión, BS menciona que una inicialización directa, como

Sick s2(2.1); 

tendrá en cuenta sólo los constructores marcados explicit si hay algún explicit constructores. Esa no es mi experiencia con varios compiladores (incluidos GCC 4.6.1 y MSVC 16/VS 2010), y no puedo encontrar tal requisito en el estándar (aunque me interesaría si alguien puede señalarlo).

Sin embargo, si enteros se utilizan en los inicializadores, creo que el ejemplo podría mostrar lo BS pretende demostrar:

#include <iostream> 

struct Sick 
{ 
    Sick(double d)  { std::cout << "double " << d << "\n"; } 
    explicit Sick(int i) { std::cout << "int " << i << "\n"; } 
}; 


int main() 
{ 
    Sick s1 = 2; 
    Sick s2(2); 
} 

Ejecución de la anterior pantalla voluntad:

double 2 
int 2 

muestra que los dos las inicializaciones aparentemente equivalentes realmente seleccionan diferentes constructores.

(O como Truncheon mencionó en la pregunta - y eché de menos - que la palabra clave explicit debería estar en el constructor Sick(double d)).

Cuestiones relacionadas