삭제된 함수가 있는 C 11의 오버로드 해결
C 11에서는 = delete 구문을 사용하여 함수를 "삭제됨"으로 표시할 수 있습니다. " 이 구문은 컴파일러가 함수 본문을 생성하는 것을 방지하고 직접 호출을 금지합니다. 그러나 이러한 삭제된 함수는 주어진 입력 매개변수 집합에 따라 호출하기에 가장 적합한 함수를 결정하는 프로세스인 오버로드 해결에 여전히 참여합니다.
이 기능이 유용한 이유는 무엇입니까? 삭제된 함수가 코드에서 완전히 제거되지 않고 숨겨지는 이유는 무엇입니까?
주요 이유는 매개변수 유형에 따라 특정 오버로드를 비활성화하는 것입니다. 삭제된 함수는 오버로드 해결에 참여하여 의도하지 않은 동작으로 이어질 수 있는 암시적 변환을 방지합니다. 다음 예를 고려하십시오.
struct onlydouble { onlydouble(std::intmax_t) = delete; onlydouble(double); };
delete가 함수를 완전히 제거하면 = delete 구문이 다음과 동일해집니다.
struct onlydouble2 { onlydouble2(double); };
이 변경으로 다음 코드는 다음과 같습니다. 법적:
onlydouble2 val(20);
컴파일러는 정수 리터럴 20을 double로 암시적으로 변환한 후 다음을 사용하는 생성자를 호출하려고 시도합니다. double.
반대로, 생성자가 삭제된 원래 예에서는 컴파일러가 함수 매개변수(std::intmax_t)와 인수(20) 사이의 정확한 일치를 감지합니다. 호출을 위해 삭제된 함수를 선택했기 때문에 오류가 발생합니다.
따라서 = delete 구문을 사용하면 매개변수 유형에 따라 호출되는 함수를 더 강력하게 제어할 수 있습니다. 의도하지 않은 결과를 초래할 수 있는 암시적 변환을 방지합니다.
또한 다음과 같은 이유로 C 사양에서는 "이것은 존재하지 않습니다"라는 개념이 필요하지 않습니다.
위 내용은 C 11에서 삭제된 기능은 과부하 해결에 어떤 영향을 줍니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!