>백엔드 개발 >C++ >이 예에서 'initializer_list'를 사용하면 템플릿 유형 추론이 실패하는 이유는 무엇입니까?

이 예에서 'initializer_list'를 사용하면 템플릿 유형 추론이 실패하는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-28 18:47:11684검색

Why Does Template Type Deduction Fail with `initializer_list` in This Example?

initializer_list를 사용한 템플릿 유형 추론

다음 함수를 고려하세요.

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

위 함수에는 단일 매개변수가 필요합니다 Begin() 및 end() 멤버 함수를 사용합니다. 다양한 데이터 유형으로 이 함수를 호출하는 방법에는 여러 가지가 있습니다. 예를 들어 std::벡터, std::string, std::array 또는 초기화 목록을 사용할 수 있습니다. 그러나 불법인 특별한 경우가 하나 있습니다.

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

이 코드 줄은 컴파일 시간 오류를 발생시킵니다. 왜 그럴까요?

템플릿 인수 추론 실패

템플릿 인수에 대한 유형 추론은 함수 매개변수 유형이 제공된 인수 유형과 일치하는 경우에만 성공할 수 있습니다. printme 함수의 경우:

  • std::벡터, std::string 및 std::array 인수는 모두 함수의 매개변수 유형에 해당하는 잘 정의된 유형을 갖습니다(예: std::벡터).
  • 초기화 목록 인수({'a', 'b', 'c'})는 그렇지 않습니다. 잘 정의된 유형이 있습니다. 특정 유형과 연관되지 않은 임시 개체입니다.
  • 결과적으로 컴파일러는 초기화 목록 인수의 경우 템플릿 인수 T를 추론할 수 없습니다. 템플릿 인수를 명시적으로 지정하면 문제가 해결됩니다(예: printme>({'a', 'b', 'c'})).

    auto의 특수 사례

    printme 함수에서는 초기화 목록 인수가 불법이지만 다음을 수행하려면 auto를 사용하는 것이 유효합니다. 초기화 목록을 보유하는 변수를 초기화합니다. 이는 auto가 il 유형을 std::initializer_list로 추론하여 컴파일러가 printme(il)의 템플릿 인수를 추론할 수 있도록 하기 때문입니다.

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

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