Пытаюсь привести функцию член к указателю на функцию член, но компиляторы не согласны между собой.
Кто прав ?
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
}