How are C++ array members handled in copy control functions?

arrays, assignment-operator, c++, copy-constructor

Solution

This is what the standard says in 12.8 (Copying class objects). Copy construction:

Each subobject is copied in the manner appropriate to its type:

- if the subobject is of class type, the copy constructor for the class is used;

- if the subobject is an array, each element is copied, in the manner appropriate to the element type;

- if the subobject is of scalar type, the built-in assignment operator is used.

Copy assignment:

Each subobject is assigned in the manner appropriate to its type:

- if the subobject is of class type, the copy assignment operator for the class is used (as if by explicit qualification; that is, ignoring any possible virtual overriding functions in more derived classes);

- if the subobject is an array, each element is assigned, in the manner appropriate to the element type;

- if the subobject is of scalar type, the built-in assignment operator is used.

Problem

This is something I have wondered for a long time. Take the following example: ``` struct matrix { float data[16]; }; ``` I know what the default constructor and destructor do in this specific example (nothing), but what about the copy constructor and the copy assignment operator? ``` 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; } }; ``` Does it involve `std::copy` or `std::uninitialized_copy` or `memcpy` or `memmove` or what?

Original source