>백엔드 개발 >C++ >C 11 SFINAE에서 '즉시 컨텍스트'를 정의하는 것은 무엇입니까?

C 11 SFINAE에서 '즉시 컨텍스트'를 정의하는 것은 무엇입니까?

DDD
DDD원래의
2024-12-12 20:17:11177검색

What Defines

C 11 SFINAE의 즉시 컨텍스트

C 11 표준은 SFINAE(Substitution Failure Is Not An Error)를 조건부 활성화 기술로 정의합니다. 또는 템플릿 인수 추론을 기반으로 코드를 비활성화합니다. 섹션 14.8.2/8에는 SFINAE로 이어지는 "하드" 컴파일 오류 또는 "소프트" 오류가 발생하는 대체 실패 조건이 간략하게 설명되어 있습니다.

표준은 이 섹션에서 "즉시 컨텍스트"를 참조합니다. , 이는 함수 유형 및 해당 템플릿 매개변수 유형의 즉각적인 컨텍스트에 있는 유효하지 않은 유형 및 표현식만이 추론 실패를 일으킬 수 있음을 나타냅니다. 그러나 "즉시 컨텍스트"의 정의는 명시적이지 않습니다.

즉시 컨텍스트에 대한 결정 절차

즉시 컨텍스트에서 대체 오류가 발생하는지 확인하려면 다음을 고려하세요. 다음:

템플릿 인수 대체에 필요한 모든 템플릿과 암시적으로 정의된 함수가 미리 생성된다고 상상해 보세요. 이 준비 중에 발생하는 오류는 즉각적인 컨텍스트가 아니며 하드 컴파일 오류가 발생합니다.

준비 단계가 성공적으로 완료되면 대체 중 후속 오류(예: 인스턴스화된 템플릿 또는 암시적으로 정의된 함수 참조) 기능 템플릿 서명에서) 오류를 구성하지는 않지만 감점을 초래합니다.

  • 예 1:

    template<typename T>
    void func(typename T::type* arg);
    
    template<typename>
    void func(...);
    
    template<typename T>
    struct A { typedef T* type; };
    
    func<A<int&>>(...);

    이 예에서는 인스턴스화 A 참조에 대한 포인터가 허용되지 않기 때문에 준비 중에 실패합니다. 이 오류는 대체 전에 발생하므로 하드 컴파일 오류가 발생합니다.

  • 예 2:

    template<typename T>
    void func(typename T::type* arg);
    
    template<typename>
    void func(...);
    
    template<typename T>
    struct A { typedef T* type; };
    
    template<>
    struct A<char> {};
    
    func<A<char>>(...);

    이 예에서는 준비 단계는 Achar를 성공적으로 인스턴스화합니다. 대체 중에 A::type이 존재하지 않는데, 이 오류는 준비 단계 이후에 발생하며 인수 추론 실패와 fallback 함수 사용으로만 이어집니다.

위 내용은 C 11 SFINAE에서 '즉시 컨텍스트'를 정의하는 것은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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