Иногда бывает разумно разделить сложные или длинные выражения на несколько шагов, например (вторая версия не более ясна, но это всего лишь пример):
return object1(object2(object3(x)));
может быть записана как:
object3 a(x);
object2 b(a);
object1 c(b);
return c;
Предполагая, что все 3 класса реализуют конструкторы, которые принимают значение rvalue в качестве параметра, первая версия может быть быстрее, поскольку временные объекты передаются и могут перемещаться. Я предполагаю, что во второй версии локальные переменные считаются lvalues. Но если переменные не используются позже, компиляторы С++ 11 оптимизируют код, поэтому переменные считаются значениями r, а обе версии работают одинаково? Меня больше всего интересует компилятор Visual Studio 2013 С++, но я также доволен тем, как компилятор GCC ведет себя в этом вопросе.
Спасибо, Михал