c++ - 类模板SFINAE

标签 c++ templates c++17 sfinae

我正在测试类模板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/

相关文章:

c++ - 为什么下面的打印树功能不起作用?

c++ - 类型推导模板函数c++

c++ - 函数模板特化编译错误

c++ - 为什么 GCC 拒绝 std::optional 引用?

c++ - std::is_invocable 为假,但 std::invoke 有效

c++ - 在返回的 lambda 中复制省略捕获的局部变量

c++ - 在 C++ 中比 Cuda 更好的计时

C++ 作用域解析问题

c++ - 从类中的 main 调用函数

c++ - 稍后添加模板函数的特化