(我为标题表示歉意,但我想不出更具描述性的内容)
This code在g ++ 8.x中无法编译,但在所有其他具有C ++ 17功能的编译器(包括g ++ 7.x)中进行编译:
#include <variant>
#include <type_traits>
template<class... Ts> struct S
{
template<std::size_t idx> using vtype =
std::variant_alternative_t<idx, std::variant<Ts...>>;
template<bool B, class T = void> using enable_if = std::enable_if_t<B, T>;
template<class T, class U> static constexpr bool is_same = std::is_same<T, U>::value;
template<std::size_t idx, enable_if< is_same<vtype<idx>, int>>...>
static bool foo() { return true ; }
template<std::size_t idx, enable_if<!is_same<vtype<idx>, int>>...>
static bool foo() { return false; }
};
auto x = S<int, char, float>::foo<1>();
为什么无法编译?
(我认为解决方法是将SFINAE +重载替换为if constexpr
)