Различное поведение g ++ и clang для SFINAE - PullRequest
0 голосов
/ 24 мая 2018

Я пишу шаблон, который должен проверять, есть ли у конструктора по умолчанию тип.

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

...