Невозможно добавить строки в С++

#include <iostream>


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

Почему этот код не работает? Ошибка:

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

Спасибо заранее!

EDIT:

Спасибо за все ответы. Это мой первый раз на сайте, и я поражен количеством подробных объяснений за такой короткий промежуток времени.

Относительно актуального вопроса. Почему это работает тогда:

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

Это потому, что ", мир", а потом "!" get concatenated с переменной hello (которая определена)?

Ответы

Ответ 1

Потому что в С++ строковые литералы (например, "Hello" не относятся к типу std::string. Это простые char массивы или строки C-стиля.

Итак, для строки const std::string message = "Hello" + ", world" + exclam;, с которыми должен работать компилятор:

const std::string message = const char[6] + const char[8] + std::string;

и учитывая ассоциативность +, операции, которые он должен выполнить, следующие:

const std::string message = ((const char[6] + const char[8]) + std::string);

То есть самое левое дополнение должно быть оценено первым, и результат передается в самое правое дополнение.

Итак, компилятор пытается оценить const char[6] + const char[8]. Для массивов не задано никакого добавления. Массивы неявно преобразуются в указатели, но это не помогает компилятору. Это просто означает, что он заканчивается const char* + const char*, и для указателей не добавляется дополнение.

В этот момент он не знает, что вы хотите, чтобы результат был преобразован в std::string.

Однако в вашем втором примере:

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

он работает, потому что операции, которые видел компилятор, были std::string + const char[8] + const char[2]. Здесь первое добавление может быть преобразовано в std::string + const char*, и здесь оператор сложения определен и возвращает a std::string. Таким образом, компилятор успешно вычислил первое сложение, и поскольку результат был строкой, второе добавление выглядит следующим образом: std::string + const char[2] и, как и раньше, это невозможно, но массив можно преобразовать в указатель, а затем компилятор может найти оператор сложения, который работает, снова приводя к std::string.

Ответ 2

"Hello" + ", world"

Так как это строки c-style, вы не можете добавить их с помощью+. Вы можете добавить std::string к строке c-style, но не к двум строкам c-style, вместо этого добавьте конструктор std::string() вокруг одного из них, чтобы сделать временный, то есть:

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

Ответ 3

С++ не выполняет многие автоматические разговоры "за кулисами" других языков OO.

Как сказал Дуг, вам нужно сделать std::string ( "hello" ) + std::string ( "мир" ), язык не делает этого для вас.

Однако вы можете сделать

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

Поскольку std:: cout знает, как печатать const char [], а также строку

Ответ 4

В строке, где вы формируете свое сообщение, сначала выполняется все выражение справа от =, и только затем оно назначается строке С++. В этот момент ваши "Hello" и ваш "World" все еще являются строками C (const char []), поэтому вы получаете ошибку. Добавление идет слева направо, поэтому пара строк C добавляется до того, как вы попытаетесь добавить комбинацию в std::string exclam.

Вам нужно либо применить их в выражении (например, std::string ( "Hello" )), либо создать строковые переменные для каждого, как вы это делали с помощью Exclam.

Ответ 5

Строковые литералы - это просто нулевой конец символа в С++. В С++ нет оператора, который позволяет добавить 2 массива символов.

Однако существует массив char и std::string +.

Изменить на:

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

В некоторых языках, таких как строковые литералы Python, эквивалентны переменным типа string. С++ не является таким языком.

Ответ 6

Строки в стиле C ( "Hello" и ", world" ) эквивалентны анонимным массивам:

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

... поэтому, когда вы вводите "Hello" + ", world", вы пытаетесь добавить два массива anon1 + anon2, которые не являются операцией, поддерживаемой C или С++.

Помните, что строковые литералы в C/С++ - это просто массивы (или адреса массивов). Вы должны использовать строковый класс (например, std:string), чтобы использовать такие операторы, как +.