Я пытаюсь понять 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 от «шаблона класса, назначенного шаблона имя-»: это значит основной шаблон, или же она включает в себя все частичные специализации и явные полные специализации, а?
(я тоже не понимаю, как изменения P0091r3, чтобы §7.1.6.2p2 не ломаются код, используя нагнетаемого учащемуся имя- S, таких как
template<class T>
struct iterator {
iterator& operator++(int) {
iterator result = *this; // injected-class-name or placeholder?
//...
}
};
, но это другой вопрос в целом.)
ли класс шаблон вычет и явные руководства дедукции поддерживаются в любой сохранившейся версии Clang или GCC (возможно под -f
флага, как -fconcepts
есть)? Если это так, я мог бы поиграть с некоторыми из этих примеров в реальной жизни и, возможно, прояснить половину своей путаницы.
На данный момент ни один главный компилятор (возможно, никакой компилятор вообще) поддерживает вывод аргумента шаблона для конструкторов. Если я не ошибаюсь, возможно, есть филиал Clang, который использовался для сбора опыта реализации, но я даже не уверен, что он доступен в любом месте в Интернете. – Morwenn