2012-01-25 13 views
5

que acabo de escribir una función:¿Cómo gestiona std :: string este truco?

void doSomeStuffWithTheString(const std::string& value) { 
... 
std::string v = value; 
std::cout << value.c_str(); 
... 
} 

pero luego me llaman a esto con

doSomeStuffWithTheString("foo"); 

y funciona. Así que habría pensado que esto funcionara (un const char * para inicializar una instancia implícita de std :: string) el valor debería pasarse por valor, pero en este caso se pasa por (const) referencia.

¿Es por casualidad una cadena std :: string implícita instanciada de const char * cuando la referencia es const? si no, ¿cómo funciona esto?

EDITAR

lo que sucede si la función está sobrecargado con

void doSomeStuffWithTheString(const char* value); 

la que se elegirá el compilador?

+0

Has respondido bastante a tu pregunta :) – pezcode

+0

interesante, no lo sabía. ¿Qué necesita tener un objeto para que tales constructores implícitos ocurran en llamadas const-by-ref (y cómo evitarlo?) – lurscher

+1

El programa está mal formado: 'std :: string = value;' no es válido y debe ser rechazado por su compilador. –

Respuesta

7

El tipo std::string tiene una conversión implícita (a través de constructor) de const char*. Esto es lo que permite que la cadena literal "foo" se convierta en std::string. Esto resulta en un valor temporal. En C++ es legal tener un const & a un valor temporal y, por lo tanto, todo esto se mantiene unido.

Es posible replicar este truco usando sus propios tipos personalizados en C++.

class Example { 
public: 
    Example(const char* pValue) {} 
}; 

void Method(const Example& e) { 
    ... 
} 

Method("foo"); 
0

Sí, un std::string temporal se construye a partir de la cadena literal.

0

Exactamente, utilizando std::string predeterminado constructor

0

"el valor tendría que ser pasado por valor, pero en este caso se pasa por referencia (const)."

Hay una característica de C++, donde es posible pasar un valor temporal (en este caso, un temporal std::string implícitamente convertido de la const char *) a un argumento de const-referencia (en este caso, const std::string &) TIPO.