Рассмотрим следующие определения строк:
string s1 = "hello", s2 = "world";
string s6 = s1 + ", " + "world";
string s7 = "hello" + ", " + s2;
В книге C++ Primer 5e говорится, что третья строка приведет к тому, что компилятор выдаст ошибку, потому что вы не можете добавлять строковые литералы. Фактическая ошибка, полученная от компилятора,
error: invalid operands of types 'const char [6]'
and 'const char [3]' to binary 'operator+'
Но разве вторая строка s6
не делает то же самое, что и s7
? В чем разница?
Поскольку сложение ассоциируется слева направо, s6
анализируется как (s1 + ", ") + "world"
. Это добавляет string
к const char *
, в результате чего получается еще один string
. Затем мы добавляем еще один const char *
к этому string
, в результате чего получается третий string
, который хранится в s6
.
s7
анализируется как ("hello" + ", ") + s2
, который пытается добавить const char *
к другому const char *
, чего вы не можете сделать. Вы можете переписать его как "hello" + (", " + s2)
, и тогда он скомпилируется.
Дубликат Объединить два строковых литерала, включая обсуждение левой ассоциативности.