#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;
};
Комментарии:
1. Вы заменили
class B
наstruct B
в своем коде. Это изменяет тип наследования с частного на общедоступный.2. Я просто хочу показать, что поведение лязга в этом случае неверно