Предоставление имени частного базового класса с помощью » using` в C

#c #language-lawyer

Вопрос:

В ситуации , когда какая-то структура D наследует другую структуру A дважды: один раз в частном порядке через B и второй раз публично через C , разрешено ли ей писать using B::A D ?

 struct A {};
class B : A {};
struct C : A {};
struct D : B, C { 
    using B::A;  //ok in GCC, error in Clang
};
 

Программа принята GCC, но Clang выводит ошибку:

 error: 'A' is a private member of 'A'
 

Демо: https://gcc.godbolt.org/z/5jeqrzorE

using B::A необходимо просто указать введенное имя класса A из D . С одной стороны, A уже доступен для использования в D (поэтому GCC принимает его), но, с другой стороны A , является закрытым внутри B (поэтому Clang отвергает его). Какой из компиляторов находится прямо здесь?

Ответ №1:

Это каким-то образом вызвало бы двусмысленность в данном случае. Поиск класса необходимо игнорировать при проверке A . GCC должен быть правильным с тех пор B::A и C::A ссылаться на то же A самое с D . Даже clang не смог обнаружить ошибку, если using C::A она добавлена

 struct A {};
struct B :  A {};
struct C : A {};
struct D : C, B { 
    using B::A;  //ok in Clang, error in GCC
    using C::A;
};
 

https://timsong-cpp.github.io/cppwp/namespace.udecl#1

Комментарии:

1. Вы заменили class B на struct B в своем коде. Это изменяет тип наследования с частного на общедоступный.

2. Я просто хочу показать, что поведение лязга в этом случае неверно