Рассмотрим следующую демонстрационную программу.
#include <iostream>
template <class T1, class T2 = T1>
struct A
{
};
template <template <class> class T>
void f( const T<int> & )
{
std::cout << "f( const T<int> & )\n";
}
int main()
{
A<int> a;
f( a );
f<A>( a );
}
Компилятор g cc HEAD 10.0.1 20200 успешно компилирует программу и вывод программы составляет
f( const T<int> & )
f( const T<int> & )
Компилятор clang HEAD 11.0.0 не компилирует ни первый вызов функции f
, ни второй вызов функции f
. Он выдает сообщение об ошибке, подобное
prog.cc:25:5: error: no matching function for call to 'f'
f( a );
^
prog.cc:9:6: note: candidate template ignored: substitution failure: template template argument has different template parameters than its corresponding template template parameter
void f( const T<int> & )
^
1 error generated.
Компилятор Visual C ++ 2019 не компилирует первый вызов функции
f( a );
, но успешно компилирует вторую функцию call
f<A>( a );
Таким образом, возникает вопрос, какой компилятор ведет себя в соответствии со стандартом C ++ 17 (или, может быть, C ++ 20)?