O tipo de um ponteiro para um método de classe usando dedução this corresponde ao tipo de um ponteiro para uma função livre:
#include <iostream>
struct TA
{
void Foo(this auto&& self)
{
std::cout << "Foo call\n";
}
};
void test_TA()
{
TA a;
void (*fun_ptr)(TA&) = &TA::Foo<TA&>;
(*fun_ptr)(a);
}
int main()
{
test_TA();
}
Isso é um tanto contraintuitivo. Por que esse design foi adotado? Há alguma dificuldade para compiladores em usar o tipo comum de um ponteiro para um método de classe ( void (TA::*mem_ptr)() &
) neste caso? Seria intuitivo.
No artigo, há uma FAQ sobre isso :