¿Deberían escribirse todas / la mayoría de las funciones de establecimiento en C ++ 11 como plantillas de funciones que aceptan referencias universales?

Considera una claseX conN variables miembro, cada una de algunascopiable ymóvil tipo, yN Funciones de ajuste correspondientes. En C ++ 98, la definición deX Probablemente se vería algo como esto:

class X
{
public:
    void set_a(A const& a) { _a = a; }
    void set_b(B const& b) { _b = b; }
    ...
private:
    A _a;
    B _b;
    ...
};

Funciones de Setter de clase.X Lo anterior puede vincular tanto a lvalue como a rvalue argumentos. Dependiendo del argumento real, estepodría dar lugar a la creación de un temporal yserá eventualmente resultará en una asignación de copia; debido a esto,no copiable Los tipos no son compatibles con este diseño.

Con C ++ 11 tenemos semánticas de movimiento, reenvío perfecto y referencias universales (la terminología de Scott Meyers), que permiten un uso más eficiente y generalizado de las funciones de establecimiento reescribiéndolos de esta manera:

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;
    ...
};

Referencias universales pueden unirse aconst/no-const, volatile/no-volatile, y para cualquier tipo convertible en general, evitando la creación de temporarios y pasando valores directamente aoperator =. No copiable, móvil los tipos son ahora compatibles. Posiblemente los enlaces no deseados pueden ser eliminados a través destatic_assert oa través destd::enable_if.

Así que mi pregunta es: comodirectriz de diseño, ¿todas las funciones del configurador (digamos, la mayoría) en C ++ 11 deben escribirse como plantillas de funciones que acepten referencias universales?

Aparte de la sintaxis más engorrosa y la imposibilidad de utilizar herramientas de ayuda de tipo Intellisense al escribir código en esas funciones de establecimiento, hay algunas desventajas relevantes con el principio hipotético "las funciones de escritura como plantillas de funciones aceptan referencias universales siempre que sea posible"?

Respuestas a la pregunta(1)

Su respuesta a la pregunta