다음 함수를 고려하세요.
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
그럼에도 불구하고 auto 키워드는 특별히 std::initializer_list<>를 지원하므로 코드가 작동할 수 있습니다. 맞습니다.
위 내용은 C의 초기화 목록에서 템플릿 추론이 실패하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!