Должны ли все / большинство установочных функций в 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 у нас есть семантика перемещения, идеальная пересылка и универсальные ссылки (терминология Скотта Мейерса), которые позволяют более эффективно и обобщенно использовать функции сеттера, переписав их следующим образом:

class X
{
public:
    template<typename T>
    void set_a(T&& a) { _a = std::forward<T>(a); }

    template<typename T>
    void set_b(T&& b) { _b = std::forward<T>(b); }
    ...
private:
    A _a;
    B _b;
    ...
};

Универсальные ссылки могут связываться сconst/ не-const, volatile/ не-volatileи к любому конвертируемому типу в целом, избегая создания временных и передачи значений прямоoperator =. Non-копируемого, движимое типы теперь поддерживаются. Возможно, нежелательные привязки могут быть устранены либо черезstatic_assert или черезstd::enable_if.

Итак, мой вопрос: какруководство по проектированиюДолжны ли все (скажем, большинство) сеттер-функции в C ++ 11 быть написаны как шаблоны функций, принимающие универсальные ссылки?

Помимо более громоздкого синтаксиса и невозможности использования вспомогательных инструментов, подобных Intellisense, при написании кода в этих установочных функциях, есть ли существенные недостатки с гипотетическим принципом »написать функции-установщики как шаблоны функций, принимающие универсальные ссылки, когда это возможно«?

Ответы на вопрос(1)

Ваш ответ на вопрос