Конкатенация строк
Почему можно делать
const string exclam = "!";
const string str = exclam + "Hello" + " world";
И это невозможно сделать:
const string exclam = "!";
const string str = "Hello" + " world" + exclam;
Я знаю (хотя не могу понять, почему), что это запрещено:
const string str = "Hello" + " world" + "!";
поскольку он будет интерпретироваться как const char[6] + const char[6] + const char[1]
, поэтому с другой стороны, почему это также недопустимо, или почему он использует char[]
, а не string
.
Ответы
Ответ 1
Оператор +
лево-ассоциативный (оценивается слева направо), поэтому сначала обрабатывается самый левый +
.
exclam
- это объект std::string
, который перегружает operator+
так, чтобы обе следующие выполняли конкатенацию:
exclam + "Hello"
"Hello" + exclam
Оба из них возвращают объект std::string
, содержащий конкатенированную строку.
Однако, если первые две вещи, которые были добавлены, являются строковыми литералами, такими как:
"Hello" + "World"
нет объекта типа класса (здесь нет std::string
). Строковые литералы преобразуются в указатели, и для указателей нет встроенного operator+
.
Ответ 2
Это потому, что вы контактируете const char[6]
+ const char[6]
, что не разрешено, как вы сказали.
В С++ строковые литералы (материал между кавычками) интерпретируются как const char[]
s.
Вы можете объединить string
с const char[]
(и наоборот), потому что оператор +
переопределен в строке, но он не может быть переопределен для базового типа.
Ответ 3
const string exclam = "!"; // Initialize a c++ string with an ansi c string
const string str = exclam + "Hello" + " world"; // Using the operator+ method of exclam
Вы можете сделать это, потому что operator+
exclam вернет новую строку, содержащую "! Hello", на которой впоследствии вы вызываете operator+
с параметром "world" в качестве параметра, поэтому вы получаете еще одну строку, которая, наконец, присваивается str с помощью конструктора копирования.
С другой стороны,
const string str = "Hello" + " world" + exclam;
не может быть выполнен, потому что "Hello" - это просто const char *
, у которого нет operator+
с параметром const char *
as.
Ответ 4
(Новый ответ, это было невозможно в 2010 году)
Теперь вы можете написать
const string str = "Hello"s + " world"s + "!"s;
// ^ ^ ^
Добавив, что s
после строкового литерала, вы говорите компилятору, что это фактически std::string
, а не const char[]
. Это означает, что вы можете вызвать функции членов на нем. Например. ("ABC"s).back()
, но также +