C++11 이후 가장 표준적이고 명확한 방법이다.
class MyClass
{
public:
MyClass() = default;
MyClass(const MyClass&) = delete; // 복사 생성 금지
MyClass& operator=(const MyClass&) = delete; // 복사 대입 금지
};
C++11 이전 방식이며, 외부에서 복사가 불가능하지만 내부 friend 함수는 접근 가능하다.
class MyClass
{
private:
MyClass(const MyClass&);
MyClass& operator=(const MyClass&);
};
스마트 포인터(unique_ptr) 방식처럼 복사는 막고 이동만 허용하는 패턴이다.
class MyClass
{
public:
MyClass() = default;
MyClass(const MyClass&) = delete;
MyClass& operator=(const MyClass&) = delete;
MyClass(MyClass&&) noexcept = default; // 이동 허용
MyClass& operator=(MyClass&&) noexcept = default;
};
리소스를 소유하는 클래스에서 자주 사용된다.
이 경우 내부에서 복사가 발생할 가능성이 있으므로 복사 자체는 delete를 같이 선언하여 막는 것이 필수이다.
class Singleton
{
private:
Singleton() {}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
};
파일 핸들, 소켓, 스레드 핸들, 메모리 버퍼 등은 하나의 객체만 소유해야 안전하게 관리된다.
예를 들어, 파일 핸들을 두 객체가 동시에 close 하는 경우 이중 해제의 위험이 존재하기 때문이다.
unique_ptr 같은 move-only 객체가 대표적이다.
이런 객체가 실수로 복사되면 성능에 큰 문제가 생긴다.
이런 클래스는 복사 자체가 개념적으로 틀리다.