История изменений
Исправление vzzo, (текущая версия) :
Мне нравится более явный первый вариант.
Второй вариант имеет следующие проблемы:
Foo *x;
x->someAction().AnotherAction(); // почему сначала ->, а потом .?
auto &z = Foo().someAction();
z.anotherAction(); // доступ к освобождённой памяти.
void f(Foo);
f(Foo()); // нет копирования.
f(Foo().someAction()); // есть копирование.
// но эта проблема решается перегрузкой всех методов с сигнатурой Foo && someAction() &&;
Тем не менее, в паттерне Builder это выглядит достаточно органично и тяжело использовать неверно.
Исправление vzzo, :
Мне нравится более явный первый вариант.
Второй вариант имеет следующие проблемы:
Foo *x;
x->someAction().AnotherAction(); // почему сначала ->, а потом .?
auto &z = Foo().someAction();
z.anotherAction(); // доступ к освобождённой памяти.
void f(Foo &&);
f(Foo()); // нет копирования.
f(Foo().someAction()); // есть копирование.
// но эта проблема решается перегрузкой всех методов с сигнатурой Foo && someAction() &&;
Тем не менее, в паттерне Builder это выглядит достаточно органично и тяжело использовать неверно.
Исходная версия vzzo, :
Мне нравится более явный первый вариант.
Второй вариант имеет следующие проблемы:
Foo *x;
x->someAction().AnotherAction(); // почему сначала ->, а потом .?
auto &z = Foo().someAction();
z.anotherAction(); // доступ к освобождённой памяти.
void f(Foo &&);
f(Foo()); // нет копирования.
f(Foo().someAction()); // есть копирование.
// но эта проблема решается перегрузкой всех методов с сигнатурой Foo && someAction() &&;
Тем не менее, в паттерне Builder это выглядит достаточно органично и тяжело использовать неверно.