2012-07-02 17 views
5

creo siguiente código debe generar un error:const char * a const std :: string &

#include <iostream> 
#include <string> 

static void pr(const std::string &aStr) 
{ 
    std::cout << aStr << "\n"; 
} 

int main(void) 
{ 
    const char *a = "Hellu"; 

    pr(a); 

    return 0; 
} 

Pero gcc 4.1.2 compila successuflly.

¿Es que el constructor de std :: string se interpone, creando una instancia de std :: string?

Creo que no debería, porque la referencia es simplemente un alias de una variable (en este caso, no hay ninguna variable de tipo std :: string a la que hace referencia la referencia).

¿Alguien está ahí para explicar por qué el código se compila con éxito?

Gracias de antemano.

Respuesta

10

Sí, dada una referencia a una constante , el compilador puede/sintetizará temporal (en este caso de tipo std::string) y obligar a la referencia a ese temporal.

Si la referencia no era para un objeto const, sin embargo, eso no funcionaría, solo una referencia a const puede vincularse a un objeto temporal como ese (aunque al menos el compilador ampliamente utilizado permite una referencia no const a enlazar a una referencia también).

+0

Hechos interesantes. Uno está aprendiendo todos los días;). Aunque no recibí tu segunda oración. ¿Quiere decir si el encabezado de la función sería 'void pr (std :: string & aStr)' una construcción de un temporal (al implicar) no es posible por el standart? – Paranaix

+0

@Paranaix: Correcto - 'pr (std :: string &)' no podría aceptar un objeto temporal. –

+0

@JerryCoffin, entonces, ¿hay alguna manera de evitar que el compilador haga una instancia temporal? – orchistro

2

Lo que encuentra es una conversión implícita.

Aquí es una cita del C++ estándar (SC22-N-4411.pdf)

1 Type conversions of class objects can be specified by constructors and by conversion functions. These conversions are called user-defined conversions and are used for implicit type conversions (Clause 4), for initialization (8.5), and for explicit type conversions (5.4, 5.2.9).

Así el compilador simplemente funciona según lo previsto y llama al constructor std::string usted ha mencionado.

Cuestiones relacionadas