¿Cómo se manejan los miembros de la matriz C ++ en las funciones de control de copia?

Esto es algo que me he preguntado por mucho tiempo. Toma el siguiente ejemplo:

struct matrix { float data[16]; }; 

Sé lo que hacen el constructor y el destructor por defecto en este ejemplo específico (nada), pero ¿qué pasa con el constructor de copias y el operador de asignación de copias?

 struct matrix { float data[16]; // automatically generated copy constructor matrix(const matrix& that) : // What happens here? { // (or here?) } // automatically generated copy assignment operator matrix& operator=(const matrix& that) { // What happens here? return *this; } }; 

¿ memcpy std::copy o std::uninitialized_copy memcpy o memmove o memmove o qué?

Esto es lo que dice el estándar en 12.8 (Copiar objetos de clase). Copiar construcción:

Cada subobjeto se copia de la manera adecuada a su tipo:

  • si el subobjeto es del tipo de clase, se utiliza el constructor de copia para la clase;
  • si el subobjeto es una matriz, cada elemento se copia, de la manera apropiada para el tipo de elemento;
  • si el subobjeto es de tipo escalar, se utiliza el operador de asignación integrado.

Copiar asignación:

Cada subobjeto se asigna de la manera adecuada a su tipo:

  • si el subobjeto es de tipo de clase, se utiliza el operador de asignación de copias para la clase (como por calificación explícita, es decir, ignorando cualquier posible función de anulación virtual en más clases derivadas);
  • si el subobjeto es una matriz, cada elemento se asigna, de la manera apropiada para el tipo de elemento;
  • si el subobjeto es de tipo escalar, se utiliza el operador de asignación integrado.