>백엔드 개발 >C++ >C의 초기화 목록에서 템플릿 추론이 실패하는 이유는 무엇입니까?

C의 초기화 목록에서 템플릿 추론이 실패하는 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-29 16:39:09643검색

Why Does Template Deduction Fail with Initializer Lists in C  ?

템플릿 추론 및 초기화 목록

다음 함수를 고려하세요.

template<typename T>
void printme(T&& t) {
  for (auto i : t)
    std::cout << i;
}

이 함수는 시작()/끝이 있는 단일 매개 변수를 사용합니다. () 활성화 유형. 그러나 다음 코드 조각은 불법으로 간주됩니다.

printme({'a', 'b', 'c'});

벡터, 문자열, 배열 및 명시적 초기화 목록을 활용하는 유사한 코드가 문제 없이 작동함에도 불구하고. 이 특정 코드 조각이 왜 불법인지에 대한 의문이 생깁니다.

이 문제를 이해하는 열쇠는 템플릿 인수 추론에 있습니다. 이 경우 템플릿 인수 T를 추론할 수 없습니다. 이 문제를 해결하려면 아래와 같이 템플릿 인수를 명시적으로 지정해야 합니다.

printme<vector<char>>({'a', 'b', 'c'})
printme<initializer_list<char>>({'a', 'b', 'c'})

코드가 합법적인 앞서 언급한 스니펫에서 인수는 템플릿 인수 T를 허용하는 잘 정의된 유형을 보유합니다. 원활하게 추론할 수 있습니다. auto를 사용하면 유형이 std::initializer_list로 추론되므로 함수가 작동할 수도 있습니다.

그러나 템플릿 인수 추론과 auto 키워드를 비교할 때 특이한 동작이 발생합니다. 자동으로 유형을 std::initializer_list로 추론하는 반면 템플릿 인수 추론은 그렇지 않습니다. 이는 C 11 표준에서 함수 매개변수가 초기화 목록일 때 템플릿 인수에 대해 추론되지 않은 컨텍스트라고 명시적으로 명시하고 있지만 매개변수에 std::initializer_list 또는 cv 한정 std에 대한 참조가 없기 때문입니다. ::initializer_list 유형.

그럼에도 불구하고 auto 키워드는 특별히 std::initializer_list<>를 지원하므로 코드가 작동할 수 있습니다. 맞습니다.

위 내용은 C의 초기화 목록에서 템플릿 추론이 실패하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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