Информация об изменениях

Сообщение Шаблонная функция с переменным количеством параметров против от 05.08.2019 14:29

Изменено 05.08.2019 17:46 _NN_

Шаблонная функция с переменным количеством параметров против простой шаблонной
Пытаюсь привести функцию член к указателю на функцию член, но компиляторы не согласны между собой.
Кто прав ?

https://gcc.godbolt.org/z/QNsgwd

template<typename T>
struct a
{
    template <typename... Args>
    void va(Args...) {}

    template <typename X>
    void x(X) {}

    void y(int) {}
};

struct b : a<b>
{
    void testva()
    {
        using F = void (a<b>::*)();

        F f = (F)&a<b>::va<int>; // gcc: error, msvc: error, clang: ok
    }

    void testx()
    {
        using F = void (a<b>::*)();

        F f = (F)&a<b>::x<int>;// gcc: error, msvc: ok, clang: ok
    }

    void testy()
    {
        using F = void (a<b>::*)();

        F f = (F)& a<b>::y; // gcc: ok, msvc: ok, clang: ok
    }
};
Шаблонная функция с переменным количеством параметров против
Пытаюсь привести функцию член к указателю на функцию член, но компиляторы не согласны между собой.
Кто прав ?

https://gcc.godbolt.org/z/QNsgwd

template<typename T>
struct a
{
    template <typename... Args>
    void va(Args...) {}

    template <typename X>
    void x(X) {}

    void y(int) {}
};

struct b : a<b>
{
    void testva()
    {
        using F = void (a<b>::*)();

        F f = (F)&a<b>::va<int>; // gcc: error, msvc: error, clang: ok
    }

    void testx()
    {
        using F = void (a<b>::*)();

        F f = (F)&a<b>::x<int>;// gcc: error, msvc: ok, clang: ok
    }

    void testy()
    {
        using F = void (a<b>::*)();

        F f = (F)& a<b>::y; // gcc: ok, msvc: ok, clang: ok
    }
};



Упрощённый пример
https://godbolt.org/z/Racc05

template<class... T>
void freefunc(T...) {}

struct a {
    template<class... T>
    void memfunc(T...) {}
};

void test() {
    using F = void(*)();
    using MF = void(a::*)();
    F f = (F)freefunc<int>; // clang: ok, gcc error, msvc: error
    MF mf = (MF)&a::memfunc<int, double>; // clang: ok, gcc error, msvc: error
}