Давайте рассмотрим этот фрагмент и предположим, что a, b, c и d являются непустыми строками.std :: string и несколько конкатенаций
std::string a, b, c, d;
d = a + b + c;
При вычислении суммы этих 3 std::string
случаев, стандартные реализации библиотек создают первый временный std::string
объект, копировать в своем внутреннем буфере объединенных буферов a
и b
, а затем выполнить ту же операцию между временной строкой и c
.
Один программист подчеркивал, что вместо этого можно было бы определить operator+(std::string, std::string)
, чтобы вернуть std::string_helper
.
Настоящая роль этого объекта заключается в том, чтобы отложить фактические конкатенации до момента, когда он был заброшен в std::string
. Очевидно, что operator+(std::string_helper, std::string)
будет определен для возврата того же помощника, который «будет иметь в виду» тот факт, что он имеет дополнительную конкатенацию для выполнения.
Такое поведение позволит сэкономить затраты ЦП на создание временных объектов n-1, выделить их буфер, скопировать их и т. Д. Поэтому мой вопрос: почему он не работает так? Я не могу придумать любой недостаток или ограничение.
Самым очевидным недостатком является сложность. – PlasmaHH
В C++ 11 временное может быть повторно использовано с помощью ссылок rvalue. – avakar
@PlasmaHH: Сложность скрыта от пользователя, поэтому не особенно плохо.Главный недостаток заключается в том, что он вводит неявное пользовательское преобразование типов, которое разбивает существующий код, который полагается на неявное преобразование из 'std :: string'. –