it's designed to be used with :
left operand of class type
right operand of pointer to a "member of this class type"
#include <iostream>
#include <string>
using std::string;
class Foo{
public:
int f(string str){
std::cout<<"Foo::f()"<<std::endl;
return 1;
}
};
int main(int argc, char* argv[]){
int (Foo::*fptr) (string) = &Foo::f;
Foo obj;
(obj.*fptr)("str");//call: Foo::f() through an object
Foo* p=&obj;
(p->*fptr)("str");//call: Foo::f() through a pointer
}
note that i didn't produce this code, it comes from a tutorial which explained how it works, but not actually what's the purpose
the difference about overloadability is the same as between . and ->, so it's not particular to this case and there's been subject about this like this one
commitee are deciding those kinds of things, not everytimes with obvious reason, but this is coherent with the fact that x-> can be seen as (*x).,
.() cannot be overload, but *() can be, so the combination of those implies that -> can be overload, because "one part of it with a different writing" can be overload
what i say last is just my mind trying to go on admiring c++ for his beauty and coherence