Debido a que en C++, literales de cadena (como "Hello"
no son de tipo std::string
. Son matrices de char de fricción, o cadenas estilo C.
Así que para la línea const std::string message = "Hello" + ", world" + exclam;
, los tipos que el compilador tiene que trabajar con son :
const std::string message = const char[6] + const char[8] + std::string;
y dada la asociatividad de +
, las operaciones que tiene que realizar son:
const std::string message = ((const char[6] + const char[8]) + std::string);
Es decir, la adición más a la izquierda debe evaluarse primero y el resultado pasar a la suma más a la derecha.
Entonces el compilador intenta evaluar const char[6] + const char[8]
. No hay una adición definida para las matrices. Las matrices se convierten implícitamente en punteros, pero esto no ayuda al compilador. Eso solo significa que termina con const char* + const char*
, y tampoco se define ninguna adición para los punteros.
En este momento, no sabe que desea que el resultado se convierta en std::string
.
Sin embargo, en el segundo ejemplo:
const std::string hello = "Hello";
const std::string message = hello + ", world" + "!";
funciona, debido a que las operaciones del compilador ver eran std::string + const char[8] + const char[2]
. Aquí, la primera adición se puede convertir a std::string + const char*
, y aquí el operador de suma está definido, y devuelve std::string
. Así que el compilador ha encontrado correctamente la primera adición, y como el resultado fue una cadena, la segunda adición se ve así: std::string + const char[2]
, y como antes, esto no es posible, pero la matriz se puede convertir en un puntero, y luego el compilador puede encontrar un operador adicional que funcione, dando como resultado un std::string
.
¿Por qué no hacer: const std :: string message = "Hola, mundo" + exclam; –
¡Bienvenido al sitio! Solo para tu información, si hay una respuesta que te guste, asegúrate de aceptarla. Es más probable que obtenga ayuda en el futuro. – JasCav