On Wed, Sep 20, 2023 at 3:50 PM Vladimir Grigoriev via Std-Discussion <std-discussion@lists.isocpp.org> wrote:

In the section "11.9 Member access control" of the C++20 Standard there is provided an example (p.#7, example #2) of using a protected inner class of a class as a base class for a derived class and the corresponding text relative to such a declaration.

Here is a simplified by me version of the example

class A {
//...
protected:
    struct B { };
};

struct D: A::B, A { };

And there is written

Similarly, the use of A::B as a base-specifier is well-formed because D is derived from A, so checking of base-specifiers must be deferred until the entire base-specifier-list has been seen.

However  this declaration

struct D: A::B, A { };
is compiled by neither for example x86-64 clang (trunk) nor by MS VS C++ with its last version of the compiler.
 
if to change the declaration like
 
struct D: A, A::B { }; 
 
then the MS VS C++ compiler compiles the declaration. However the compiler x86-64 clang (trunk)  still does not compile the declaration. 
 
is it a bug of the compilers?

It seems that the standard is pretty explicit here about the intent, so it's a compiler bug.
 
 
With best regards,
(Vlad from Moscow)
 
--
Std-Discussion mailing list
Std-Discussion@lists.isocpp.org
https://lists.isocpp.org/mailman/listinfo.cgi/std-discussion


--
Brian Bi