При
s="b"+"k"+"4";
ваши буквенные строки будут распадаться на указатели, и вы сложите эти указатели вместе и присвойте результат s
. Это добавление указателя не имеет смысла, нет перегруженной операторной функции +
, которая принимает два const char *
аргумента.
Но с
s=s1+"b"+"k"+"4";
вы начинаете с объекта std::string
, для которых есть перегруженные +
операторные функции, которые возвращают std::string
объект. Короче говоря, это что-то похожее на
s=((s1+"b")+"k")+"4";
То есть у вас есть s1 + "b"
, который возвращает временный std::string
, к которому вы затем добавляете "k"
, который возвращает временный std::string
, к которому вы добавьте "4"
, который возвращает временный std::string
, который назначен на s
. Или с явно используемыми вызовами временных объектов и функций:
std::string t1 = operator+(s1, "b");
std::string t2 = operator+(t1, "k");
std::string t3 = operator+(t2, "4");
s = t3;