Deleted-function

Modern C++에 적응하기
Effective Modern C++ Chapter 3. Deleted function


deleted function

C++98에서 사용을 금지하고싶은 멤버 함수는 private영역에 선언 후 정의하지 않았다.

1
2
3
4
5
6
7
template <typename charT, class traits = char_traits<charT>>
class basic_ios : public ios_base {
...
private:
basic_ios(const basic_ios&);
basic_ios& operator=(const basic_ios&);
};

이러한 형태의 함수는 private영역에 선언되어 있으므로 클라이언트가 외부에서 호출할 수 없다.
만약 접근 가능한 위치에서 호출한다고 하여도 선언만 있을뿐, 정의가 없기때문에 링크단계에서 실패한다.


C++11에서는 함수의 선언 끝에 = delete키워드를 붙여 함수를 삭제하는 방법이 추가되었다.

1
2
3
4
5
6
7
template <typename charT, class traits = char_traits<charT>>
class basic_ios : public ios_base {
...
public:
basic_ios(const basic_ios&) = delete;
basic_ios& operator=(const basic_ios&) = delete;
};

이 방식으로 삭제된 함수를 호출하면 컴파일단계에서 실패한다. 기존 방식이 링크단계에 가서야 오류가 발견되는 것에 비해 개선이 되었다고 볼 수 있다.

= delete키워드로 삭제된 함수는 public영역에 선언하는 것이 관례이다.
멤버함수가 호출되면 C++는 먼저 함수의 접근성을 검사한 후에 삭제 여부를 확인한다.
private영역에 함수를 선언하면 컴파일러에 따라 삭제 여부가 아닌 접근성 부분을 문제삼을 수 있다.


= delete는 멤버함수 뿐만 아니라 비멤버 함수나 템플릿 인스턴스등, 어떤 함수라도 삭제할 수 있다.


References

Author

Joyus.Gim

Posted on

2022-07-26

Updated on

2022-07-26

Licensed under

Comments