Search code examples
c++arrayscopy-constructorassignment-operator

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


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?


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.