Следующий код
#include <iostream>
#include <utility>
template<typename F, typename... T>
struct Wrapper{ };
template<typename T>
struct is_wrapper : std::false_type {};
template<typename... T>
struct is_wrapper<Wrapper<T...>> : std::true_type {};
//template<typename F, typename... T>
//struct is_wrapper<Wrapper<F, T...>> : std::true_type {};
int main()
{
Wrapper<int, double> w;
std::cout << is_wrapper<decltype(w)>::value << std::endl;
}
печатает 0. Однако, если разбить две строки посередине, она печатает 1.
Почему он не всегда печатает 1? Должна ли вторая второстепенная специализация охватывать случай, который, по-видимому, покрывается третьей (прокомментированной) частичной специализацией?