Должны ли все / большинство установочных функций в C ++ 11 быть написаны как шаблоны функций, принимающие универсальные ссылки?
Рассмотрим классX
сN
переменные-члены, каждая из некоторыхкопируемого а такжедвижимое тип иN
соответствующие функции сеттера. В C ++ 98 определениеX
скорее всего будет выглядеть примерно так:
class X
{
public:
void set_a(A const& a) { _a = a; }
void set_b(B const& b) { _b = b; }
...
private:
A _a;
B _b;
...
};
Сеттер-функции классаX
Выше можно связать как с lvalue, так и с rvalue аргументами. В зависимости от фактического аргумента, этоможет быть привести к созданию временного ибудут в конечном итоге привести к назначению копии; В связи с этим,без копируемого типы не поддерживаются этим дизайном.
С C ++ 11 у нас есть семантика перемещения, идеальная пересылка и универсальные ссылки (Скотт Мейерсs терминология), которые позволяют более эффективно и обобщенно использовать функции сеттера, переписав их следующим образом:
class X
{
public:
template
void set_a(T&& a) { _a = std::forward(a); }
template
void set_b(T&& b) { _b = std::forward(b); }
...
private:
A _a;
B _b;
...
};
Универсальные ссылки могут связываться сconst
/ Не-,const
volatile
/ не-volatile
и к любому конвертируемому типу в целом, избегая создания временных и передачи значений прямо в.operator =
Non-копируемого,движимое типы теперь поддерживаются. Возможно, нежелательные привязки могут быть устранены либо черезstatic_assert
или через.std::enable_if
Итак, мой вопрос: какруководство по проектированию, все должныскажем, большинство) сеттер-функции в C ++ 11 записываются как шаблоны функций, принимающие универсальные ссылки?
Помимо более громоздкого синтаксиса и невозможности использования вспомогательных инструментов, подобных Intellisense, при написании кода в этих установочных функциях, есть ли существенные недостатки с гипотетическим принципом »написать функции-установщики как шаблоны функций, принимающие универсальные ссылки, когда это возможно "?