[prev in list] [next in list] [prev in thread] [next in thread] 

List:       cfe-commits
Subject:    Re: [PATCH] Optimize pointers to member function
From:       Olivier Goffart <ogoffart () kde ! org>
Date:       2013-02-14 19:58:26
Message-ID: 16801317.B46aqPkVYg () gargamel
[Download RAW message or body]

On Thursday 14 February 2013 11:05:28 John McCall wrote:
> On Feb 14, 2013, at 3:57 AM, Olivier Goffart <ogoffart@kde.org> wrote:
> > This patch optimize comparison and calling of pointers to member function.
> > 
> > If we know that a given class do not have multiple inheritance, we can
> > simplify the comparison and the calls as the pointer to this will never be
> > shifted.
> > On the Microsoft ABI (which is not implemented in clang), the size of a
> > pointer to a member function is even reduced in that case.[1]
> 
> 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.

Notice that since Microsoft changes the size of the pointer depending on that 
fact, it means it cannot be possible to point to a member of a derived class.

-- 
Olivier

_______________________________________________
cfe-commits mailing list
cfe-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic