소멸자나 복사 생성자, 복사 대입 연산자를 제공하지 않으면 컴파일러는 이동 연산자나 이동 대입 연산자를 자동으로 제공하지 않는다.
또한, 이동 연산자나 이동 대입 연산자를 제공하지 않으면 컴파일러는 복사 생성자나 복사 대입 연산자를 제공하지 않는다.
#include <iostream>
using namespace std;
class A {
int a;
public:
A(int a = 0) : a(a) {}
// 1: 복사생성자, 이동생성자 생략
~A() { cout << "~A() : " << a << endl; }
};
int main() {
A a(1);
A c(a);
}
// 2
A(A&& other) = default;
A(const A& other) = default;
// 있으나 없으나 정상 동작한다.
// 3-1: 오류 C2280 'A::A(const A &)': 삭제된 함수를 참조하려고 합니다
A(const A& other) = delete;
// 3-2: 오류 C2280 'A::A(const A &)': 삭제된 함수를 참조하려고 합니다
A(A&& other) = delete;
// 3-1과 같은 오류 (하나가 없으면 나머지도 없기 때문에)
// 4-1: 3-2 해결
A(A&& other) = delete;
A(const A& other) = default;
// A::A(A&&) 는 없어도 A::A(const A&)는 default처리!
class A {
...
// 3-1 : 쓰임새
A(const A& other) = delete;
...
};
int main() {
A a(1);
A b(2);
//A c{ a }; // lvalue 초기화 X
A d {a + b}; // rvalue 초기화 O
}