Это то, о чем я давно задумался. Возьмем следующий пример:
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 (Копирование объектов класса). Копирование конструкции:
Каждый подобъект копируется в соответствии с его типом:
- Если подобъект имеет тип класса, используется конструктор копирования для класса;
- , если подобъектом является массив, каждый элемент копируется в соответствии с типом элемента;
- Если подобъект имеет скалярный тип, используется встроенный оператор присваивания.
Назначение копирования:
Каждый подобъект присваивается в соответствии с его типом:
- если подобъект имеет тип класса, используется оператор присваивания экземпляра для класса (как если бы он был явным путем, т.е. игнорировал любые возможные функции виртуального переопределения в более производных классах);
- , если подобъектом является массив, каждый элемент назначается в соответствии с типом элемента;
- Если подобъект имеет скалярный тип, используется встроенный оператор присваивания.