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

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

Susan Sarandon
Susan Sarandon원래의
2024-12-05 01:52:09194검색

Why Does Template Type Deduction Fail with `initializer_list` in C  ?

initializer_list 및 템플릿 유형 추론

템플릿 유형 추론은 컴파일러가 템플릿에 전달된 인수로부터 템플릿의 유형 인수를 추론할 수 있도록 하는 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 그러나 템플릿 인수는 그렇지 않습니다. 이는 C 11 표준의 § 14.8.2.5/5에서 이것이 템플릿 인수에 대한 추론되지 않은 컨텍스트라고 명시적으로 명시하고 있기 때문입니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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