_y, double _z) : x(_x), y(_y), z(_z) {} // Не надо такое писать! Point(const Point &other) : x(other.x), y(other.y), z(other.z) {} }; Такой конструктор можно не писать, он будет сгенерирован автоматически (копирование всех полей)
который она ссылается. • Foo const & – константная lvalue-ссылка. Объект изменять нельзя. • Foo && – rvalue-ссылка. Ссылка на временный объект, который можно изменять, поскольку он всё равно больше использоваться не будет. «Деструктивное чтение».
b) { T tmp {static_cast<T&&>(a)}; // конструктор может затереть a a = static_cast<T&&>(b); // присваивание может затереть b b = static_cast<T&&>(tmp); // присваивание может затереть tmp } // То же самое, с использованием std::move template<class T> void swap(T& a, T& b) { T tmp {std::move(a)}; // перемещаем из a a = std::move(b); // перемещаем из b b = std::move(tmp); // перемещаем из tmp }
не генерируется. • Если явно объявлена любая операция копирования, перемещения или деструктор, то операции копирования, перемещения и деструктор не генерируются. Но: