Это недопустимое выражение, потому что нет оператора + для строковых литералов
"Hello" + " "+"World
(точнее для указателей, потому что в выражениях строковые литералы с редкими исключениями преобразуются в указатели на свои первые символы.)
Вместо этого вы можете написать
std::string a;
( ( a += "Hello" ) += " " ) += "World";
Но было бы более читабельно, если написать
a += "Hello";
a += " ";
a += "World";
Или, как @ Вирсавия указала в (ценном) комментарии к моему ответу, вы можете использовать определяемый пользователем строковый литерал следующим образом
#include <string>
#include <iostream>
int main()
{
using namespace std::string_literals;
std::string a;
a += "Hello"s + " " + "World";
std::cout << a << '\n';
}
Что касается этого утверждения
a += "Hello" + name +"World";
тогда его можно переписать с использованием операторов, определенных для класса std::basic_string
template<class charT, class traits, class Allocator>
basic_string<charT, traits, Allocator>
operator+(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs);
и
template<class charT, class traits, class Allocator>
basic_string<charT, traits, Allocator>
operator+(basic_string<charT, traits, Allocator>&& lhs, const charT* rhs);
как
a += operator +( operator +( "Hello", name ), "World" );
Например
#include <string>
#include <iostream>
int main()
{
std::string a;
std::string name = "Old";
a += operator +( operator +( "Hello ", name ), " World" );
std::cout << a << '\n';
}
Учтите, что каждый оператор возвращает объект типа std::basic_string
, для которого определен operator +
. То есть в каждом вызове операторов в качестве аргумента присутствует объект типа std::basic_string
.