Я тестирую шаблон класса SFINAE.
template<typename T, typename...Types>
using enable_if_class = T;
template<typename T, typename...Types>
struct enable_if_test;
template<typename T>
struct enable_if_test<T, enable_if_class<T, typename std::enable_if<std::is_const<T>::value, int>::type>> {
enable_if_test() {
std::cout << "const version!\n";
}
};
template<typename T>
struct enable_if_test<T, enable_if_class<T, typename std::enable_if<!std::is_const<T>::value, int>::type>> {
enable_if_test() {
std::cout << "nonconst version!\n";
}
};
вышеприведенные коды компилируются на g ++, но выдают ошибку на clang ++ и visual studio. когда коды изменяются на:
template<typename T, typename...Types>
using enable_if_class = T;
template<typename T, typename...Types>
struct enable_if_test;
template<typename T>
struct enable_if_test<T, enable_if_class<void, typename std::enable_if<std::is_const<T>::value, int>::type>> {
enable_if_test() {
std::cout << "const version!\n";
}
};
template<typename T>
struct enable_if_test<T, enable_if_class<void, typename std::enable_if<!std::is_const<T>::value, int>::type>> {
enable_if_test() {
std::cout << "nonconst version!\n";
}
};
, на этот раз только g ++ получает ошибку. так вот мой вопрос, это ошибка компилятора или мой код является незаконным? если это ошибка компилятора, есть ли какая-то причина, по которой эта ошибка возникает?