> 백엔드 개발 > C++ > C 11에서 삭제된 기능은 과부하 해결에 어떤 영향을 줍니까?

C 11에서 삭제된 기능은 과부하 해결에 어떤 영향을 줍니까?

Mary-Kate Olsen
풀어 주다: 2024-12-15 15:22:24
원래의
374명이 탐색했습니다.

How Do Deleted Functions in C  11 Influence Overload Resolution?

삭제된 함수가 있는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿