Предполагая, что str
является классом для хранения строковых значений, он перегрузит оператор сложения, чтобы поддерживать конкатенацию строк. Нравится:
str operator+(const str &a,const str &b);
Но проблема в том, что если у нас есть что-то вроде этого:
str s=str("Hel") + str("lo ") + str("Wor") + str("ld!");
Затем он создаст 3 временных объекта (поскольку мы получаем новый объект при каждом добавлении), которые на самом деле не нужны в этом контексте. Простым решением этой проблемы может быть перегрузка нового оператора сложения, который принимает ссылку на rvalue в качестве левого операнда и возвращает этот операнд также как ссылку на rvalue после объединения его с правым операндом. Что-то вроде этого:
str &&operator+(str &&a,const str &b){
a+=b;
return std::move(a);
}
Перегрузив этот оператор, упомянутый оператор просто создаст один временный объект, а следующие добавления будут просто объединены с этим временным объектом.
Мой вопрос в том, является ли этот метод правильным решением этой проблемы?
std::ostringstream
). В противном случае каноническим решением будет перегрузитьoperator+=
и написатьoperator+
, взяв левое значение по значению относительно него. - person Alexandre C.   schedule 31.08.2015