>백엔드 개발 >C++ >삭제된 C 11 기능이 여전히 과부하 해결에 참여하는 이유는 무엇입니까?

삭제된 C 11 기능이 여전히 과부하 해결에 참여하는 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-23 10:13:18210검색

Why Do Deleted C  11 Functions Still Participate in Overload Resolution?

오버로드된 해상도에 C 11 삭제 함수가 포함되는 이유

C 11에서는 함수를 "삭제됨"으로 표시하는 = delete 구문을 도입했습니다. 그들의 호출. 이는 이러한 함수가 완전히 제거되지 않고 왜 여전히 오버로드 해결에 참여하는지에 대한 의문을 제기합니다.

= delete의 주요 목적은 특정 매개변수를 사용하여 특정 함수의 호출을 방지하는 것입니다. 이는 특히 의도하지 않은 결과를 초래할 수 있는 시나리오에서 암시적 변환을 금지하는 것을 목표로 합니다. 결과적으로 = delete가 특정 오버로드를 효과적으로 금지하려면 오버로드 해결에 참여하는 것이 필수적입니다.

다음 예를 고려하십시오.

struct onlydouble {
  onlydouble(std::intmax_t) = delete;
  onlydouble(double);
};

= delete가 함수를 완전히 제거한 경우에는 동일한 결과가 발생합니다. 효과는 다음과 같습니다.

struct onlydouble2 {
  onlydouble2(double);
};

이 경우 다음 코드는 다음과 같습니다. 유효:

onlydouble2 val(20);

컴파일러는 정수를 사용하는 생성자를 호출하려고 시도하지만 암시적으로 20을 double로 변환하고 double을 사용하는 생성자를 성공적으로 호출합니다.

그러나 = delete를 사용하면 intmax_t를 취하는 onlydouble 생성자의 호출이 명시적으로 금지됩니다. 컴파일러는 암시적 변환을 시도하지 않고 대신 오류를 발생시켜 이 금지된 오버로드의 사용을 방지합니다.

게다가 = delete는 "이것이 존재하지 않습니다"가 아니라 "이것을 금지합니다"를 의미합니다. C 사양은 "존재하지 않는" 함수의 개념을 정의하지 않습니다. 대신 특정 호출을 명시적으로 금지하는 메커니즘을 제공하여 프로그래머가 컴파일러의 동작을 제어하고 원치 않는 암시적 변환을 방지할 수 있도록 합니다.

위 내용은 삭제된 C 11 기능이 여전히 과부하 해결에 참여하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.