¿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?