devxlogo

No Member-Function to Pointer-to-Member-Function Conversion

No Member-Function to Pointer-to-Member-Function Conversion

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.

See also  5 Tips for Working With an Onsite Interpreter
devxblackblue

About Our Editorial Process

At DevX, we’re dedicated to tech entrepreneurship. Our team closely follows industry shifts, new products, AI breakthroughs, technology trends, and funding announcements. Articles undergo thorough editing to ensure accuracy and clarity, reflecting DevX’s style and supporting entrepreneurs in the tech sphere.

See our full editorial policy.

About Our Journalist