¿Cuándo comenzará a marcar la diferencia la adición de un constructor de movimientos y un operador de asignación de movimientos?

Teniendo en cuenta la alta calidad de los compiladores de hoy en día con respecto a la optimización del valor de retorno (tanto RVO como NRVO), me preguntaba qué complejidad de clase es realmente significativa comenzar a agregar constructores de movimientos y operadores de asignación de movimientos.

Por ejemplo, para estoreally_trivial clase, solo asumo que la semántica de movimiento no puede ofrecer nada más de lo que RVO y NRVO ya ofrecen al copiar instancias de ella:

class really_trivial
{
    int first_;
    int second_;

public:

    really_trivial();
    ...
};

Mientras en estosemi_complex clase, agregaría un constructor de movimientos y un operador de asignación de movimientos sin dudarlo:

class semi_complex
{
    std::vector<std::string> strings_;

public:

    semi_complex(semi_complex&& other);
    semi_complex& operator=(semi_complex&& other);
    ...
};

Entonces, ¿en qué cantidad y de qué tipo de variables miembro comienza a tener sentido agregar constructores de movimiento y operadores de asignación de movimiento?

Respuestas a la pregunta(5)

Su respuesta a la pregunta