728x90
반응형
함수를 '삭제'할 수 있다. 즉, 함수가 존재하지 않는다고 명시하여 그것을 사용하려고 시도하는 것은 오류다. 가장 확실한 용도는 기본 설정이 아닌 기능을 제거하는 것이다. 예를 들어, 베이스로 사용되는 클래스의 복사는 슬라이싱으로 이어지기 때문에 이를 방지하고자 하는 것이 일반적이다.
class Base {
// ...
Base& operator=(const Base&) = delete;// disallow copying
Base(const Base&) = delete;
Base& operator=(Base&&) = delete; // disallow moving
Base(Base&&) = delete;
};
Base x1;
Base x2 {x1}; // error : no copy constr uctor
복사 및 이동을 활성화 및 비활성화하는 것은 일반적으로 원하지 않는 것을 말하는 것(=delete를 사용하여) 보다 원하는 것을 말하는 것으로(=default를 사용하여) 더 편리하게 수행된다. 그러나 선언할 수 있는 모든 함수를 삭제할 수 있다. 예를 들어, 함수 템플릿의 가능한 특수화 집합에서 특수화를 제거할 수 있다.
template<class T>
T∗ clone(T∗ p) // return copy of *p
{
return new T{∗p};
};
Foo∗ clone(Foo∗) = delete; // don’t try to clone a Foo
void f(Shape∗ ps, Foo∗ pf)
{
Shape∗ ps2 = clone(ps); // fine
Foo∗ pf2 = clone(pf); // error : clone(Foo*) deleted
}
또 다른 응용 프로그램은 원하지 않는 변환을 제거하는 것이다.
struct Z {
// ...
Z(double); // can initialize with a double
Z(int) = delete; // but not with an integer
};
void f()
{
Z z1 {1}; // error : Z(int) deleted
Z z2 {1.0}; // OK
}
추가 용도는 클래스를 할당할 수 있는 위치를 제어하는 것이다.
class Not_on_stack {
// ...
˜Not_on_stack() = delete;
};
class Not_on_free_store {
// ...
void∗ operator new(siz e_t) = delete;
};
소멸될 수 없는 지역 변수를 가질 수 없으며, 클래스의 메모리 할당 연산자가 =delete일 때 자유 저장소에 객체를 할당할 수 없다.
void f()
{
Not_on_stack v1; // error : can’t destroy
Not_on_free_store v2; // OK
Not_on_stack∗ p1 = new Not_on_stack; // OK
Not_on_free_store∗ p2 = new Not_on_free_store; // error : can’t allocate
}
그러나 우리는 Not_on_stack 객체를 삭제할 수 없다. 소멸자를 비공개로 만드는 대체 기술은 이 문제를 해결할 수 있다.
=delete 된 함수와 단순히 선언되지 않은 함수의 차이를 유의하자. 전자의 경우 컴파일러는 프로그래머가 삭제된 함수를 사용하려고 했음을 인지하고 오류를 제공한다. 후자의 경우 컴파일러는 소멸자를 호출하지 않거나 전역 연산자 new()를 사용하는 것과 같은 대안을 찾는다.
728x90
반응형
'Program Language > C & C++' 카테고리의 다른 글
[C++] std::list 정렬하기 (0) | 2022.01.21 |
---|---|
[C++] unique_lock, lock_guard (0) | 2022.01.19 |
[C++] static 멤버 초기화 (0) | 2022.01.17 |
[C++] initializer-list 생성자 (0) | 2022.01.14 |
[C++] 클래스 static 멤버 (0) | 2022.01.14 |