Да, string operator+ (const char* lhs, const string& rhs)
создает и возвращает неназванный временный строковый объект.
cout << "Some text"
вызывает ostream & ostream :: operator << (const char * const) и возвращает ссылку ostream. </p>
cout << "Some text" << s1 << "some more text\n";
равно ostream::operator<<( "Some text").operator<<(s1).operator<<("some more text\n")
, три вызова cout, вызывающие две разные перегрузки op <<, op <<, который принимает <code>const* char* const, и op <<, который принимает <code>const string&. Нет выделения памяти, и единственное копирование - в буфер cout.
cout << "Some text" + s1 + "some more text\n";
- это ostream::operator<<(t1)
для временного строкового объекта, который я назову t1 , который t1 является временным результатом ::operator+ ( "Some text", s1).operator+("some more text\n")
. (Обратите внимание, что первый оператор + не является членом строки, но op + (const char * const, const string &) в области имен. Он возвращает строку, поэтому второй + "это string :: operator + (const char * const) .)
Таким образом, два временных строковых объекта создаются (и затем уничтожаются) в этом коде. Это означает два внутренних представления для строк (таким образом, два выделения памяти) и две копии двух, которые недавно распределили память (в дополнение к копированию в буфер cout).