сама специализация, а не шаблон.
.deduct.type] пункт 8 перечисляет все выведенные контексты, но, похоже, не включаетtemplate-name
<TT>
гдеtemplate-name
относится к шаблону класса иTT
ссылается на аргумент шаблона шаблона. Это выведенный контекст?
Если это так, почему?
Если нет, рассмотрите следующий код:
template<template<typename> class U, template<typename> class V>
struct foo {};
template<template<typename> class U>
struct foo<U, U> {};
int main() {}
Этот код компилируетсяпод Clang 7.0.0 а такжеGCC 8.0.1Это означает, что компиляторы считают частичную специализацию более специализированной, чем основной шаблон, что означаетU
а такжеV
в первичном шаблоне успешно выводятсяfoo<U, U>
, Это ошибка компилятора?