템플릿 유형 추론은 컴파일러가 템플릿에 전달된 인수로부터 템플릿의 유형 인수를 추론할 수 있도록 하는 C의 강력한 기능입니다. 주형. 그러나 어떤 경우에는 컴파일러가 유형 인수를 추론할 수 없으며 원하는 유형 인수를 사용하여 템플릿을 명시적으로 인스턴스화해야 합니다.
다음 함수를 고려하세요.
template<typename T> void printme(T&& t) { for (auto i : t) std::cout << i; }
이것은 함수에는 Begin()/end() 지원 유형의 단일 매개변수가 필요합니다. 문제는 다음 코드가 왜 불법입니까?
printme({'a', 'b', 'c'});
이 모든 코드가 합법적인 경우:
printme(std::vector<char>({'a', 'b', 'c'})); printme(std::string("abc")); printme(std::array<char, 3> {'a', 'b', 'c'});
다음과 같이 작성할 수도 있습니다.
const auto il = {'a', 'b', 'c'}; printme(il);
또는:
printme<std::initializer_list<char>>({'a', 'b', 'c'});
코드의 첫 번째 줄은 템플릿 인수 T를 추론할 수 없기 때문에 불법입니다. 템플릿 인수가 명시적으로 지정되면 작동합니다. 예:
printme<std::vector<char>>({'a', 'b', 'c'})
또는:
printme<std::initializer_list<char>>({'a', 'b', 'c'})
인수에 잘 정의된 유형이 있으므로 다른 코드 줄은 적법합니다. 이므로 템플릿 인수 T는 잘 추론될 수 있습니다.
헷갈릴 수 있는 부분은 자동이 유형을 선택한다는 것입니다. std::initializer_list
A function parameter for which the associated argument is an initializer list (8.5.4) but the parameter does not have std::initializer_list or reference to possibly cv-qualified std::initializer_list type.
그러나 auto를 사용하면 § 7.1.6.4/6에 std::initializer_list<>:
if the initializer is a braced-init-list (8.5.4), with std::initializer_list<U>.에 대한 명시적인 지원
위 내용은 C에서 `initializer_list`를 사용하면 템플릿 유형 추론이 실패하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!