类模板SFINAE

问题描述 投票:0回答:2

我正在测试班模板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 ++出错。所以这是我的问题,这是编译器错误还是我的代码非法?如果这是编译器错误,是否有任何原因导致此错误?

c++ templates c++17 sfinae
2个回答
0
投票

在GCC中,这是一个编译器错误,在4.9.4版和更低版本中可见,在5.1版中已修复。

GCC 4.9.4 Demo

GCC 5.1 Demo

我建议您使用较新版本的GCC或CLANG。


0
投票

似乎是clang / msvc的错误,类似于1558发现的CWG(std::void_t),使用:

std::void_t

使所有编译器感到高兴:

template<typename T, typename...Types> struct enable_if_class_impl { using type = T; }; template<typename T, typename...Types> using enable_if_class = typename enable_if_class_impl<T, Types...>::type;

Demo (T)

© www.soinside.com 2019 - 2024. All rights reserved.