Как элементы массива С++ обрабатываются в функциях управления копированием?

Это то, о чем я давно задумался. Возьмем следующий пример:

struct matrix
{
    float data[16];
};

Я знаю, что делает конструктор и деструктор по умолчанию в этом конкретном примере (ничего), но как насчет конструктора копирования и оператора назначения копирования?

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;
    }
};

Включает ли он std::copy или std::uninitialized_copy или memcpy или memmove или что?

Ответ 1

Это то, что стандарт говорит в 12.8 (Копирование объектов класса). Копирование конструкции:

Каждый подобъект копируется в соответствии с его типом:

  • Если подобъект имеет тип класса, используется конструктор копирования для класса;
  • , если подобъектом является массив, каждый элемент копируется в соответствии с типом элемента;
  • Если подобъект имеет скалярный тип, используется встроенный оператор присваивания.

Назначение копирования:

Каждый подобъект присваивается в соответствии с его типом:

  • если подобъект имеет тип класса, используется оператор присваивания экземпляра для класса (как если бы он был явным путем, т.е. игнорировал любые возможные функции виртуального переопределения в более производных классах);
  • , если подобъектом является массив, каждый элемент назначается в соответствии с типом элемента;
  • Если подобъект имеет скалярный тип, используется встроенный оператор присваивания.