LINUX.ORG.RU

История изменений

Исправление 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 это выглядит достаточно органично и тяжело использовать неверно.