P0091r3 (현재 C++ 초안 표준 인 N4606에 채택 된 "클래스 템플릿에 대한 템플릿 인수 차감"용지)을 이해하려고합니다.C++에서 클래스 템플릿 인수 공제에 대한 질문 17
나는 나는 그것이 템플릿 이름은 하나의 템플릿을 식별하는 가장 간단한 경우, 작동 방법을 이해 믿습니다
template<class T>
struct S {
S(T);
S(const std::vector<T>&);
};
int main()
{
std::vector<int> v;
auto s = S(v);
}
S
는 기본 템플릿을 식별를, 그래서 우리는 구성된 가상의 과부하 세트를 만들
template<class T> void Sctor(T);
template<class T> void Sctor(const std::vector<T>&);
과 가상 통화 오버로드 확인을 수행
Sctor(v)
이 경우 우리는 가상의 Sctor(const std::vector<T>&) [with T=int]
을 호출하기로 결정했습니다. 결국 우리는 S<int>::S(const std::vector<int>&)
이라고 부르며 모든 것이 훌륭하게 작동한다는 것을 의미합니다.
이해가 안되는 부분은 부분 특수화가있는 상태에서 이것이 작동하는 방식입니다.
template<class T>
struct S {
S(T);
};
template<class T>
struct S<std::list<T>> {
S(const std::vector<T>&);
};
int main()
{
std::vector<int> v;
auto s = S(v);
}
은 우리가 직관적으로 여기를 원하는 것은 S<std::list<int>>::S(const std::vector<int>&)
를 호출합니다. 그건 우리가 실제로 얻는 것입니까? 이 부분은 어디에 지정되어 있습니까?
기본적으로 나는 직관적으로 P0091r3 "는 템플릿 이름에 의해 지정된 클래스 템플릿"에 의해 무엇을 의미하는지 이해가 안
: 그건 기본 템플릿을 의미 하는가, 또는 그것뿐만 아니라 모든 부분 전문화 및 명시 적 전체 전문 포함되어 있습니까? 는 (나는 또한 §7.1.6.2p2에 P0091r3의 변경은template<class T>
struct iterator {
iterator& operator++(int) {
iterator result = *this; // injected-class-name or placeholder?
//...
}
};
로 주입 수준의 이름을의를 사용하여 암호를 해독하지 않는 방법을 이해하지 않습니다하지만 완전히 다른 질문입니다. -fconcepts
이 같은)
클래스 템플릿 공제 및 명시 적으로 공제 가이드), 아마도 -f
깃발 아래 연타 나 GCC (의 현존 버전에서 지원하고 있습니까? 만약 그렇다면, 나는 현실에서 이러한 예들 중 일부를 가지고 놀 수 있었고 아마 혼란의 절반을 정리할 수 있었다.
현재 주요 컴파일러 (아마도 컴파일러가 전혀 없음)는 생성자에 대한 템플릿 인수 공제를 지원하지 않습니다. 필자가 잘못 생각하지 않는다면 어딘가에서 구현 환경을 수집하는 데 사용 된 Clang 브랜치가있을 수 있지만 온라인에서도 사용할 수 있는지조차 확신 할 수 없습니다. – Morwenn