>백엔드 개발 >C++ >`std::function`에 동등 비교가 부족한 이유는 무엇입니까?

`std::function`에 동등 비교가 부족한 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-10-30 04:36:28281검색

Why Does `std::function` Lack Equality Comparison?

std::function의 동등 비교 수수께끼 풀기

수수께끼:

왜 std::function이, 동등 비교 기능이 부여되지 않은 최신 C 코드베이스의 필수 구성 요소입니까? 이 질문은 처음부터 프로그래머를 당황하게 하여 호출 가능한 개체 컬렉션을 관리하는 데 혼란과 어려움을 초래했습니다.

초기 모호함:

C 초기 초안에서 11 표준에서는 연산자== 및 연산자!=에 대한 오버로드가 선언되었지만 삭제되어 적절하게 설명되지 않은 공백이 남습니다. "유형 시스템의 가능한 구멍을 닫습니다"라는 설명은 숨겨진 결함을 암시했지만 그 특성은 여전히 ​​미스터리로 남아 있습니다.

허점과 안전 장치:

The 의심되는 "허점"은 부울 변환 함수의 존재에서 비롯됩니다. 명시적인 동등 비교 연산자가 없는 경우 이 함수는 == 또는 !=를 통해 암시적 비교를 허용할 수 있습니다. 그러나 이 허점은 다음에서 알 수 있듯이 예상치 못한 동작으로 이어질 수 있습니다.

<code class="cpp">struct S {
    operator bool() { return false; }
};

int main() {
    S a, b;
    bool are_equal(a == b); // Uses operator bool on a and b!
}</code>

C 03은 safe-bool 관용구를 도입했고 C 11은 이 허점을 방지하기 위해 명시적인 부울 변환 기능을 구현했습니다.

std::shared_ptr:

std::function과 달리 std::shared_ptr은 잘 정의된 동등 의미 체계를 갖습니다. 두 포인터가 모두 비어 있거나 둘 다 비어 있지 않고 동일한 개체를 가리키는 경우 두 포인터는 동일합니다. 이 명확한 정의를 통해 std::shared_ptr에서 동등 비교 연산자를 구현할 수 있었습니다.

수수께끼 풀기:

std::function 동등성을 비교 가능하게 만들지 않는 이유 임의의 호출 가능 유형에 대해 의미 있는 동등 기준을 정의하는 본질적인 과제에서 비롯됩니다. 강제로 적용하면 모든 함수 개체 구현자에게 부담이 되며 바인딩 인수의 차이로 인해 여전히 모호한 비교가 발생할 수 있습니다. 게다가 항등 연산자가 없기 때문에 암시적 변환으로 인해 발생하는 허점이 효과적으로 닫힙니다.

위 내용은 `std::function`에 동등 비교가 부족한 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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