2010-02-24 21 views
14
#include <iostream> 


int main() 
{ 
    const std::string exclam = "!"; 
    const std::string message = "Hello" + ", world" + exclam; 
    std::cout << message; 
    return 0; 
} 

¿Por qué este código no funciona? Error devuelto:No se pueden agregar cadenas en C++

error: invalid operands of types `const char[6]' and `const char[8]' to binary `operator+' 

¡Gracias de antemano!

EDITAR:

Gracias por todas las respuestas. Esta es mi primera vez en el sitio y estoy sorprendido por la cantidad de explicaciones elaboradas en un intervalo de tiempo tan corto.

Acerca de la pregunta real. ¿Cómo es que esto funciona? Entonces:

const std::string hello = "Hello"; 
const std::string message = hello + ", world" + "!"; 

¿Es porque ", mundo" y luego "!" obtener concatenado con variable hello (que se define)?

+0

¿Por qué no hacer: const std :: string message = "Hola, mundo" + exclam; –

+0

¡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

Respuesta

18

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.

+5

+1, @jalf - excelente respuesta –

4

En la línea donde forma su mensaje, la expresión completa a la derecha de = se realiza primero, y solo entonces se asigna a una cadena de C++. En ese momento, su "Hola" y su "Mundo" siguen siendo cadenas C (const char []) y es por eso que está recibiendo un error. La suma va de izquierda a derecha, por lo que el par de cadenas C se agrega antes de intentar agregar la combinación al std :: string exclam.

Debe moldearlos dentro de la expresión (por ejemplo, std :: string ("Hola")) o crear variables de cadena para cada uno como lo hizo con Exclam.

15
"Hello" + ", world" 

Dado que se trata de cadenas de estilo c, no puede agregarlas con +. Puede agregar una std :: string a una cadena c-style, pero no 2 cadenas c-style de esta manera, en su lugar agregue un constructor std :: string() alrededor de una de ellas para hacer una temporal, por ejemplo:

"Hello" + std::string(", world") 
+4

También podría omitir el operador '+' entre '" Hola "' y '", mundo "' como: 'const std :: string message =" Hola "", mundo "+ exclam;' Esto es también una forma aceptable de concatenar literales de cadena. – fogo

4

Los literales de cadena son simplemente una matriz terminada en cero de caracteres en C++. No hay ningún operador que le permita agregar 2 matrices de caracteres en C++.

Sin embargo, hay una matriz char y un operador std :: string +.

Cambiar a:

const std::string message = std::string("Hello") +", world" + exclam; 

En algunos lenguajes como Python literales de cadena son equivalentes a las variables de cadenas tipo. C++ no es ese lenguaje.

6

C++ no hace muchas de las conversaciones automáticas "entre bastidores" de otros lenguajes de OO.

Como Doug dijo que necesita hacer std :: string ("hello") + std :: string ("world"), el idioma no hace esto por usted.

Sin embargo se puede hacer

std::cout << "hello" << "world" << exclam; 

Debido a std :: cout sabe cómo imprimir un const char [], así como una cadena

3

cadenas estilo C ("Hola" y", mundo ") son equivalentes a matrices anónimas:

static const char anon1[6] = { 'H', 'e', 'l', 'l', 'o', '\0' }; 
static const char anon2[8] = { ',', ' ', 'w', 'o', 'r', 'l', 'd', '\0' }; 

...por lo tanto, cuando ingresa "Hello" + ", world", intenta agregar dos matrices anon1 + anon2, que no es una operación compatible con C o C++.

Recuerde, los literales de cadena en C/C++ son solo matrices (o direcciones de matrices). Debe utilizar una clase de cadena (por ejemplo, std:string) para utilizar operadores como +.

Cuestiones relacionadas