mardi 8 janvier 2019

Using using-declarations to overload with base class, gcc accepts clang rejects

Here is a minimal example that does not have any includes:

template <bool B, typename T> struct enable_if { using type = T; };
template <typename T> struct enable_if<false, T> { };
template <bool B, typename T> using enable_if_t = typename enable_if<B, T>::type;

struct X {
    template <typename T, enable_if_t<sizeof(T) == 1, int> = 0>
    static void foo();
};

struct Y : X {
    using X::foo;

    template <typename T, enable_if_t<(sizeof(T) > 1), int> = 0>
    static void foo();
};

void test() {
    Y::foo<char>();
    Y::foo<int>();
}

gcc accepts this program (with the first call correctly invoking X::foo). clang rejects the call to Y::foo<char>(). Apparently, clang doesn't actually consider these functions to differ for some reason.

I swear I've run into this before, and I seem to recall there being some quirk in using-declarations and templates that makes this not as obvious as I might expect. Who's right?

Aucun commentaire:

Enregistrer un commentaire