SFINAE的不同g ++和clang行为

时间:2018-05-24 13:48:55

标签: c++ templates sfinae

我正在编写应该检查的模板,如果有类型的默认构造函数。

void _void_f(){}

template<typename T, typename ENABLE = void>
struct is_constructible_default {
    static const bool value = false;
};

template<typename T>
struct is_constructible_default<T, typename std::enable_if<std::is_same<decltype((T()), _void_f()),void>::value>::type> {
    static const bool value = true;
}

这适用于具有实现的构造函数,生成的构造函数或没有默认构造函数的类。但是,当默认构造函数为private时,g ++编译器退出时出错,即T()是私有的。但由于SFINAE,错误应该忽略那个过载。 对于clang,这个实现工作正常。如何为g ++实现std :: is_default_constructible?

https://godbolt.org/g/qAZaJb

哪个编译器就在这里?

我可能找到了g ++的解决方案。 STL实现使用SFINAE方法而不是使用enable_if。

struct is_default_constructible_impl
{
    template<typename T, typename = decltype(T())>
    static std::true_type test(int);

    template<typename>
    static std::false_type test(...);
};

template<typename T>
struct is_constructible_default : decltype(is_default_constructible_impl::test<T>(0))
{};

https://godbolt.org/g/DQ4yZp

0 个答案:

没有答案