#include <algorithm>
#include <cstdint>
#include <initializer_list>
#include <iostream>
template<typename T>
class Array {
public:
Array(std::size_t size):
m_buf(new T[size]),
m_size(size)
{
std::cout << "Array::Array(std::size_t)" << std::endl;
}
Array(const std::initializer_list<T>& init):
m_buf(new T[init.size()]),
m_size(init.size())
{
std::cout << "Array::Array(const std::initializer_list<T>&)" << std::endl;
std::copy(std::begin(init), std::end(init), m_buf);
}
Array(const Array& other):
m_buf(new T[other.m_size]),
m_size(other.m_size)
{
std::cout << "Array::Array(const Array&)" << std::endl;
std::copy(other.m_buf, other.m_buf + other.m_size, m_buf);
}
Array(Array&& other):
m_buf(other.m_buf),
m_size(other.m_size)
{
std::cout << "Array::Array(Array&&)" << std::endl;
// Важно! Если этого не сделать, вызов деструктора на other сделает
// невалидным конструируемый объект
other.m_buf = nullptr;
}
~Array()
{
delete[] m_buf;
}
Array& operator=(const Array& other)
{
std::cout << "Array::operator=(const Array&)" << std::endl;
if (this != &other)
{
delete[] m_buf;
m_buf = new T[other.m_size];
m_size = other.m_size;
std::copy(other.m_buf, other.m_buf + other.m_size, m_buf);
}
return *this;
}
Array& operator=(Array&& other)
{
std::cout << "Array::operator=(Array&&)" << std::endl;
m_buf = other.m_buf;
m_size = other.m_size;
// Важно! Если этого не сделать, вызов деструктора на other сделает
// невалидным конструируемый объект
other.m_buf = nullptr;
return *this;
}
private:
T *m_buf;
std::size_t m_size;
};
int main() {
Array<int> a1 = { 1, 2, 3, 4, 5 };
Array<int> a2 = { 6, 7, 8 };
Array<int> a3 = a1;
Array<int> a4 = std::move(a2); // a2 невалиден после этой строки
a1 = a3;
a2 = std::move(a4); // a4 невалиден после этой строки
return 0;
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGNzdGRpbnQ+CiNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgojaW5jbHVkZSA8aW9zdHJlYW0+Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpjbGFzcyBBcnJheSB7CnB1YmxpYzoKCUFycmF5KHN0ZDo6c2l6ZV90IHNpemUpOgoJCW1fYnVmKG5ldyBUW3NpemVdKSwKCQltX3NpemUoc2l6ZSkKCXsKCQlzdGQ6OmNvdXQgPDwgIkFycmF5OjpBcnJheShzdGQ6OnNpemVfdCkiIDw8IHN0ZDo6ZW5kbDsKCX0KCQoJQXJyYXkoY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PFQ+JiBpbml0KToKCQltX2J1ZihuZXcgVFtpbml0LnNpemUoKV0pLAoJCW1fc2l6ZShpbml0LnNpemUoKSkKCXsKCQlzdGQ6OmNvdXQgPDwgIkFycmF5OjpBcnJheShjb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4mKSIgPDwgc3RkOjplbmRsOwoJCXN0ZDo6Y29weShzdGQ6OmJlZ2luKGluaXQpLCBzdGQ6OmVuZChpbml0KSwgbV9idWYpOwoJfQoJCglBcnJheShjb25zdCBBcnJheSYgb3RoZXIpOgoJCW1fYnVmKG5ldyBUW290aGVyLm1fc2l6ZV0pLAoJCW1fc2l6ZShvdGhlci5tX3NpemUpCgl7CgkJc3RkOjpjb3V0IDw8ICJBcnJheTo6QXJyYXkoY29uc3QgQXJyYXkmKSIgPDwgc3RkOjplbmRsOwoJCXN0ZDo6Y29weShvdGhlci5tX2J1Ziwgb3RoZXIubV9idWYgKyBvdGhlci5tX3NpemUsIG1fYnVmKTsKCX0KCQoJQXJyYXkoQXJyYXkmJiBvdGhlcik6CgkJbV9idWYob3RoZXIubV9idWYpLAoJCW1fc2l6ZShvdGhlci5tX3NpemUpCgl7CgkJc3RkOjpjb3V0IDw8ICJBcnJheTo6QXJyYXkoQXJyYXkmJikiIDw8IHN0ZDo6ZW5kbDsKCQkvLyDQktCw0LbQvdC+ISDQldGB0LvQuCDRjdGC0L7Qs9C+INC90LUg0YHQtNC10LvQsNGC0YwsINCy0YvQt9C+0LIg0LTQtdGB0YLRgNGD0LrRgtC+0YDQsCDQvdCwIG90aGVyINGB0LTQtdC70LDQtdGCCgkJLy8g0L3QtdCy0LDQu9C40LTQvdGL0Lwg0LrQvtC90YHRgtGA0YPQuNGA0YPQtdC80YvQuSDQvtCx0YrQtdC60YIKCQlvdGhlci5tX2J1ZiA9IG51bGxwdHI7Cgl9CgkKCX5BcnJheSgpCgl7CgkJZGVsZXRlW10gbV9idWY7Cgl9CgkKCUFycmF5JiBvcGVyYXRvcj0oY29uc3QgQXJyYXkmIG90aGVyKQoJewoJCXN0ZDo6Y291dCA8PCAiQXJyYXk6Om9wZXJhdG9yPShjb25zdCBBcnJheSYpIiA8PCBzdGQ6OmVuZGw7CgkJCgkJaWYgKHRoaXMgIT0gJm90aGVyKQoJCXsKCQkJZGVsZXRlW10gbV9idWY7CgkJCW1fYnVmID0gbmV3IFRbb3RoZXIubV9zaXplXTsKCQkJbV9zaXplID0gb3RoZXIubV9zaXplOwoJCQlzdGQ6OmNvcHkob3RoZXIubV9idWYsIG90aGVyLm1fYnVmICsgb3RoZXIubV9zaXplLCBtX2J1Zik7CgkJfQoJCQoJCXJldHVybiAqdGhpczsKCX0KCQoJQXJyYXkmIG9wZXJhdG9yPShBcnJheSYmIG90aGVyKQoJewoJCXN0ZDo6Y291dCA8PCAiQXJyYXk6Om9wZXJhdG9yPShBcnJheSYmKSIgPDwgc3RkOjplbmRsOwoJCW1fYnVmID0gb3RoZXIubV9idWY7CgkJbV9zaXplID0gb3RoZXIubV9zaXplOwoJCS8vINCS0LDQttC90L4hINCV0YHQu9C4INGN0YLQvtCz0L4g0L3QtSDRgdC00LXQu9Cw0YLRjCwg0LLRi9C30L7QsiDQtNC10YHRgtGA0YPQutGC0L7RgNCwINC90LAgb3RoZXIg0YHQtNC10LvQsNC10YIKCQkvLyDQvdC10LLQsNC70LjQtNC90YvQvCDQutC+0L3RgdGC0YDRg9C40YDRg9C10LzRi9C5INC+0LHRitC10LrRggoJCW90aGVyLm1fYnVmID0gbnVsbHB0cjsKCQlyZXR1cm4gKnRoaXM7Cgl9CgkKcHJpdmF0ZToKCVQgKm1fYnVmOwoJc3RkOjpzaXplX3QgbV9zaXplOwp9OwoKaW50IG1haW4oKSB7CglBcnJheTxpbnQ+IGExID0geyAxLCAyLCAzLCA0LCA1IH07CglBcnJheTxpbnQ+IGEyID0geyA2LCA3LCA4IH07CglBcnJheTxpbnQ+IGEzID0gYTE7CglBcnJheTxpbnQ+IGE0ID0gc3RkOjptb3ZlKGEyKTsgLy8gYTIg0L3QtdCy0LDQu9C40LTQtdC9INC/0L7RgdC70LUg0Y3RgtC+0Lkg0YHRgtGA0L7QutC4CglhMSA9IGEzOwoJYTIgPSBzdGQ6Om1vdmUoYTQpOyAvLyBhNCDQvdC10LLQsNC70LjQtNC10L0g0L/QvtGB0LvQtSDRjdGC0L7QuSDRgdGC0YDQvtC60LgKCXJldHVybiAwOwp9