Конкатенация строк

Почему можно делать

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(), но также +