Рассмотрим 2 следующие перегрузки
template<typename T>
bool test() {
return true;
}
template<template<typename ...> class T>
bool test() {
return false;
}
Первый работает для обычных классов, второй - для шаблонов, которые не создаются. Например:
std::cout<<test<int>()<<std::endl; <-- this yields 1
std::cout<<test<std::list>()<<std::endl; <--this yields 0
Теперь рассмотрим следующую функцию шаблона:
template<typename U>
bool templfun(){
struct A{
bool f(){
return test<A>(); // <-- this gives an error
}
};
return test<A>(); // <-- this is ok
}
В GCC это дает ошибку для неоднозначного разрешения перегрузки, в то время как Clang компилирует. Интересно, что второй вызов test () не приводит к ошибкам (даже в GCC). Более того, если я template<typename U>
уберу эту вещь поверх templfun, gcc перестанет жаловаться.
Это ошибка в GCC или это незаконный код?