我正在编写应该检查的模板,如果有类型的默认构造函数。
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?
哪个编译器就在这里?
我可能找到了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))
{};