Я пишу шаблон, который должен проверять, есть ли у конструктора по умолчанию тип.
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;
}
Это прекрасно работает для классов с реализованным конструктором, сгенерированным конструктором или без конструктора по умолчанию.Однако, когда конструктор по умолчанию является закрытым, компилятор g ++ завершает работу с ошибкой, что T () является закрытым.Но из-за SFINAE ошибка должна просто игнорировать эту перегрузку.Для Clang эта реализация работает нормально.Как реализован std :: is_default_constructible для g ++?
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