我正在测试类模板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++出错。
所以这是我的问题,这是编译器错误还是我的代码非法?
如果这是编译器错误,是否有任何原因导致此错误?
最佳答案
在GCC中,这是在4.9.4版及更低版本中可见的编译器错误,在5.1版中已修复。
GCC 4.9.4 Demo
GCC 5.1 Demo
我建议您使用较新版本的GCC或CLANG。
关于c++ - 类模板SFINAE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61403192/