Невозможно добавить строки в С++
#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
), чтобы использовать такие операторы, как +
.