Title
Missing case in description of member access ambiguity
Status
c++11
Section
7.6.1.5 [expr.ref]
Submitter
US

Created on 2010-08-02.00:00:00 last changed 130 months ago

Messages

Date: 2010-11-15.00:00:00

[Voted into the WP at the November, 2010 meeting.]

Date: 2010-09-15.00:00:00

Proposed resolution (September, 2010):

Change 7.6.1.5 [expr.ref] paragraph 5 as follows:

If E2 is a non-static data member or a non-static member function, the program is ill-formed if the class of which E2 is directly a member is an ambiguous base (6.5.2 [class.member.lookup]) of the naming class (11.8.3 [class.access.base]) of E2. [Note: The program is also ill-formed if the naming class is an ambiguous base of the class type of the object expression; see 11.8.3 [class.access.base]. —end note]
Date: 2010-08-02.00:00:00
N3092 comment US 32

According to 7.6.1.5 [expr.ref] paragraph 5,

If E2 is a non-static data member or a non-static member function, the program is ill-formed if the class of which E2 is directly a member is an ambiguous base (6.5.2 [class.member.lookup]) of the naming class (11.8.3 [class.access.base]) of E2.

This does not cover the following case:

    struct A { int i; };
    struct B: A { };
    struct C: A, B { };
    void f(C* p) {
      p->A::i; // Should be ambiguous
    }

Notes (August, 2010):

The example in the FCD National Body comment is incorrect: it is missing the A:: in the next-to-last line.

The ambiguity actually is covered in the Standard but in an unexpected location: 11.8.3 [class.access.base] paragraph 6:

If a class member access operator, including an implicit “this->,” is used to access a non-static data member or non-static member function, the reference is ill-formed if the left operand (considered as a pointer in the “.” operator case) cannot be implicitly converted to a pointer to the naming class of the right operand.

An explanatory note, including a cross-reference to 11.8.3 [class.access.base], should be added to 7.6.1.5 [expr.ref] paragraph 6.

History
Date User Action Args
2014-03-03 00:00:00adminsetstatus: fdis -> c++11
2011-04-10 00:00:00adminsetstatus: dr -> fdis
2010-11-29 00:00:00adminsetmessages: + msg3153
2010-11-29 00:00:00adminsetstatus: tentatively ready -> dr
2010-10-18 00:00:00adminsetmessages: + msg2974
2010-10-18 00:00:00adminsetstatus: drafting -> tentatively ready
2010-08-02 00:00:00admincreate