2011-10-21 14 views
6

Tengo el siguiente código C++:moldeada en los constructores de tipo C++

#include <iostream> 
#include <string> 

    int main(int argc, char* argv[]) 
    { 
     const std::string s1 = "ddd"; 
     std::string s2(std::string(s1)); 
     std::cout << s2 << std::endl; 
    } 

El resultado es: 1 ¿Por qué? Cuando uso -Wall bandera, advertencia del compilador de escritura: la dirección de 'std :: cadena s2 (std :: string)' siempre evaluará como 'verdadero'

Pero este código:

#include <iostream> 
#include <string> 

int main(int argc, char* argv[]) 
{ 
    const std::string s1 = "ddd"; 
    std::string s2((std::string)(s1)); 
    std::cout << s2 << std::endl; 
} 

el resultado: ddd

es resultado normal

+3

No podría usted acaba de hacer la segunda línea s2 std :: string (S1); '¿Por qué necesita incluir el segundo 'std :: string'? – rhololkeolke

+1

¿Por qué crear una copia intermedia? ¿Por qué no 'std :: string s2 = s1;'? –

+0

@Oscar: su versión crea una variable inicializada por defecto intermedia y luego copia mediante el operador de asignación de copias. La versión correcta sin nada intermedio es la de rho. – Xeo

Respuesta

13

Most-vexing-parse.

std::string s2(std::string(s1)); 

se analiza como la declaración de una "función que toma un parámetro llamado std::strings1 y devolviendo una std::string". A continuación, intente imprimir esa función, que primero la convertirá en un puntero de función (norma de decaimiento/conversión normal). Como el operator<< de std::ostream no está sobrecargado para los punteros de función en general, intentará una conversión a bool, que tiene éxito, y como el puntero de función no es nulo, se convierte al valor booleano true, que se imprime como 1.

cambiarlo a

std::string s2((std::string(s1))); 

o incluso mejor, sólo

std::string s2(s1); 
+0

O 'std :: string s2 = s1;' –

+1

@Oscar: Copiar ctor> operador de asignación de copias. :) – Xeo

+7

'std :: string s2 = s1;' llama al constructor de copia porque es una declaración. –

Cuestiones relacionadas