default, delete

DongWook Lee·2024년 7월 18일

C++

목록 보기
2/18

소멸자복사 생성자, 복사 대입 연산자를 제공하지 않으면 컴파일러는 이동 연산자이동 대입 연산자를 자동으로 제공하지 않는다.
또한, 이동 연산자이동 대입 연산자를 제공하지 않으면 컴파일러는 복사 생성자복사 대입 연산자를 제공하지 않는다.

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

0개의 댓글