¿Peligro con los operadores de asignación de movimiento de base virtual cuando ahora se les permite usar?

Esto se refiere a la resolución de C ++ Issuehttp://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1402 . Resumen:

template<typename T>
struct wrap
{
   wrap() = default;

   wrap(wrap&&) = default;
   wrap(const wrap&) = default;

   T t;
};

struct S {
   S(){}
   S(const S&){}
   S(S&&){}
};

typedef wrap<const S> W;

// Error, defaulted move constructor of "wrap<const S>" is deleted!
W get() { return W(); }

(El problema es que estamos recibiendo un error para este fragmento de código, aunque el compilador podría simplemente usar el constructor de copia de "S", como lo hace cuando el usuario escribe explícitamente el constructor de movimiento de "wrap". El problema se resolvió para ignorar los constructores de movimientos eliminados (y los operadores de asignación) durante las resoluciones de sobrecarga, por lo tanto, utilice el constructor de copia anterior como se desee.)

Cuando la resolucionFue redactado, se hizo el siguiente comentario. sobre esta resolución:

No hay restricciones adicionales para las operaciones de movimiento implícitas / predeterminadas relativas a la copia. Esto significa que la asignación de movimientos en una base virtual es peligrosa (y los compiladores probablemente deberían advertir) [...] Pero en Batavia decidimos que no íbamos a preservar todo el código C ++ 03 contra las operaciones de movimientos implícitos, y creo que Esta resolución proporciona importantes beneficios de rendimiento.

¿Puede alguien describir cuál es la preocupación con los operadores de asignación de movimiento de base virtual?

Respuestas a la pregunta(1)

Su respuesta a la pregunta