Does you compiler accept the following code?
class A { public: void f(int); }; void (A::*pm)(int) = A::f; // #1 no ampersand before A::f
A standard-compliant compiler should flag line #1 as an error. Let’s examine it in further detail to see why. The expression A::f is called a qualified-id. A qualified-id denotes a member of a class. According to the C++ standard, there is no implicit conversion from a qualified-id denoting a member function to the type “pointer to member function”. In other words, an ampersand must appear before the qualified-id if you want to take the address of the member function. For example:
void (A::*pm)(int) = &A::f; // now OK
Programmers who are new to the concept of pointers to members are often confused by this subtlety. After all, when dealing with ordinary functions, implicit conversion from a function type to the type “pointer to function” does exist:
void g(); void (*pf) () = g; // OK, implicit conversion of g to &g
However, there are many differences between a qualified-id and a plain function’s name. Enabling implicit conversion of a qualified-id to a member function’s address can therefore cause confusion and ambiguities. To avoid this, C++ requires that a class member’s address be taken explicitly by preceding an ampersand to the qualified-id. Even if your compiler happens to accept the code in line #1, you should add an ampersand to avoid maintenance problems in the future, and to make your code more readable.