C++ Logo

std-discussion

Advanced search

Re: Name lookup

From: Russell Shaw <rjshaw_at_[hidden]>
Date: Thu, 27 Feb 2025 11:19:20 +1100
On 27/2/25 00:36, Andrew Schepler wrote:
> On Wed, Feb 26, 2025 at 8:07 AM Russell Shaw via Std-Discussion <std-
> discussion_at_[hidden] <mailto:std-discussion_at_[hidden]>> wrote:
>
> Hi,
>
> In [class.member.lookup], using g++, i get "error: request for member ‘x’ is
> ambiguous" for 'f.x = 0;'
>
>
> clang++ 19.1.0, icpx 2025.0.0, and MSVC 19 all compile it without errors or
> warning, matching the Standard's requirements. A gcc bug report is already open:
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77725 <https://gcc.gnu.org/
> bugzilla/show_bug.cgi?id=77725>

Hi,

I don't like that the std says it's non-ambiguous.

It's clearly ambiguous. How does it justify that it's not ?

The wording 'is unambiguous because the A and B base class subobjects' seems to
first appear in 2017/n4640.txt

Did clang++/icpx/MSVC change their lookup algorithm from prior to 2017 ?

> ------------------------------------------------------
> example 1
>
> struct A { int x; }; // S(x,A) = { { A::x }, { A } }
> struct B { float x; }; // S(x,B) = { { B::x }, { B } }
> struct C: public A, public B { }; // S(x,C) = { invalid, { A in C, B in C } }
> struct D: public virtual C { }; // S(x,D) = S(x,C)
> struct E: public virtual C { char x; }; // S(x,E) = { { E::x }, { E } }
> struct F: public D, public E { }; // S(x,F) = S(x,E)
>
> int main() {
> F f;
> f.x = 0; // OK, lookup finds E::x
> }
> ------------------------------------------------------
>
> I agree with g++ because the inheritance diagram is:
>
> A.x B.x
> \ /
> C
> / \
> D E.x
> \ /
> F
>
> f.x could be A.x, B.x, or E.x, but the standard is saying that it's unambiguous.
> --
> Std-Discussion mailing list
> Std-Discussion_at_[hidden] <mailto:Std-Discussion_at_[hidden]>
> https://lists.isocpp.org/mailman/listinfo.cgi/std-discussion <https://
> lists.isocpp.org/mailman/listinfo.cgi/std-discussion>
>

Received on 2025-02-27 00:19:27