[PATCH] Optimize pointers to member function

John McCall rjmccall at apple.com
Thu Feb 14 13:49:23 PST 2013


On Feb 14, 2013, at 1:42 PM, Olivier Goffart <ogoffart at kde.org> wrote:
> On Thursday 14 February 2013 12:20:31 Richard Smith wrote:
>> On Thu, Feb 14, 2013 at 11:58 AM, Olivier Goffart <ogoffart at kde.org> wrote:
>>> On Thursday 14 February 2013 11:05:28 John McCall wrote:
>>>> On Feb 14, 2013, at 3:57 AM, Olivier Goffart <ogoffart at kde.org> wrote:
>>>> 
>>>> A pointer-to-member may point to a member of a derived class.
>>> 
>>> How?
>>> 
>>> struct A { void m(); };
>>> struct B : A { void n(); };
>>> int main() { void (A::*t)() = &B::n; }
>>> 
>>> error: cannot initialize a variable of type 'void (A::*)()' with an rvalue
>>> of type 'void (B::*)()': different classes ('A' vs 'B')
>>> 
>>> C++11[4.11.2]
>>> 
>>>   A prvalue of type “pointer to member of B of type cv T”, where B is a
>>>   class type, can be converted to a prvalue of type “pointer to member of
>>>   D of type  cv T”, where D is a derived class (Clause 10) of B. [...]
>>> 
>>> You can convert from a base to a derived, but not the other way around.
>> 
>> [expr.static.cast]p12.
> 
> There I read: 
> 
>   [...] If class B contains the original member, or is a base or derived
>   class of the class containing the original member, the resulting pointer to
>   member points to the original member. Otherwise, the result of the cast is
>   undefined.
> 
>> int main() { void (A::*t)() = (void(A::*)())&B::n; }
> 
> So that cast is undefined.

The original member is B::n, and A is a base class of the class containing
the original member.

John.



More information about the cfe-commits mailing list