Deleted-function
Modern C++에 적응하기
Effective Modern C++ Chapter 3. Deleted function
deleted function
C++98에서 사용을 금지하고싶은 멤버 함수는 private
영역에 선언 후 정의하지 않았다.
1 | template <typename charT, class traits = char_traits<charT>> |
이러한 형태의 함수는 private
영역에 선언되어 있으므로 클라이언트가 외부에서 호출할 수 없다.
만약 접근 가능한 위치에서 호출한다고 하여도 선언만 있을뿐, 정의가 없기때문에 링크단계에서 실패한다.
C++11에서는 함수의 선언 끝에 = delete
키워드를 붙여 함수를 삭제하는 방법이 추가되었다.
1 | template <typename charT, class traits = char_traits<charT>> |
이 방식으로 삭제된 함수를 호출하면 컴파일단계에서 실패한다. 기존 방식이 링크단계에 가서야 오류가 발견되는 것에 비해 개선이 되었다고 볼 수 있다.
= delete
키워드로 삭제된 함수는 public
영역에 선언하는 것이 관례이다.
멤버함수가 호출되면 C++는 먼저 함수의 접근성을 검사한 후에 삭제 여부를 확인한다.
private
영역에 함수를 선언하면 컴파일러에 따라 삭제 여부가 아닌 접근성 부분을 문제삼을 수 있다.
= delete
는 멤버함수 뿐만 아니라 비멤버 함수나 템플릿 인스턴스등, 어떤 함수라도 삭제할 수 있다.
References
Deleted-function