【发布时间】:2020-04-24 07:23:01
【问题描述】:
我正在测试类模板 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++ 出错。 所以这是我的问题,这是编译器错误还是我的代码是非法的? 如果这是编译器错误,是否有某种原因导致此错误?
【问题讨论】:
-
请在问题中包含错误信息
-
顺便说一句,这里 g++ 接受Demo (
T)、Demo (void) 两个版本。
标签: c++ templates c++17 sfinae