Пытаюсь привести функцию член к указателю на функцию член, но компиляторы не согласны между собой.
Кто прав ?
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
}
Здравствуйте, dead0k, Вы писали:
D>Здравствуйте, _NN_, Вы писали:
D>А это так и задумано, что ты указатель на функцию с 1 аргументом пытаешь привести к указателю на функцию без аргументов во всех трех вариантах?
Да.
Насколько я понимаю так как указатель на свободную функцию всегда можно привести к void(*)(), то указатель на функцию член класса всевгда можно првести к void(C::*)().
К void* функцию приводить нельзя в любом случае.
_NN>Насколько я понимаю так как указатель на свободную функцию всегда можно привести к
указателю на любой тип свободной функции.
_NN>К void* функцию приводить нельзя в любом случае.
Не нельзя.
Здравствуйте, σ, Вы писали:
_NN>>Насколько я понимаю так как указатель на свободную функцию всегда можно привести к
σ>указателю на любой тип свободной функции.
_NN>>К void* функцию приводить нельзя в любом случае.
σ>Не нельзя.
void(*)() не приводим к void* в общем случае.