см следующего кодаСтранное поведение с помощью декларирования
struct A { using type = int; };
struct B : private A {};
struct C : B { using base_type = A; };
Всех НКУ 6.1, лязг 3.8 и MSVC 2015 обновления 3 отказывается компилировать это, как A
не достижимое имя внутри C
так A
является частной базой B
. Кажется, что gcc думает, что A
в using base_type = A
ссылается на конструктор по умолчанию A
. msvc и clang - нет.
Возможно, ошибка компиляции из-за введения имен, вызванного наследств (поскольку изменение using base_type = A
в using base_type = ::A
сделать все компиляторы работают нормально), но я хочу знать, если эта странная ошибка, что говорит стандарт.
Более конкретно,
- Как я понял, не так, как
A::type
,A
это просто имя класса (хотя GCC ошибочно воспринимает его как имя функции), которая вводится вC
не внутриA
ниB
. Почему это имя считается закрытым дляB
? - Если эта ошибка компиляции считается ошибкой или является краевым случаем спецификаций стандарта?
Я предполагаю, что это связано с тем, как работает поиск имени для 'A' внутри' C'.Сначала он проверяет, не объявлено ли что-либо с именем 'A' в области' C' перед 'использованием'. Поскольку он не находит его, он проверяет его в области 'B', так как это базовый класс. И в случае, если он не найдет 'A' в области' B ', он будет выглядеть в« глобальном пространстве имен ». Но каким-то образом «частное наследование» 'A' by' B' останавливается при втором поиске i.e внутри области 'B'. Поскольку он работает с использованием имени «полностью квалифицированного», это заставляет меня думать, что реальная проблема должна быть в тех же строках. – Arunmu
http://eel.is/c++draft/class.access.spec#5 кажется актуальным –
@PiotrSkotnicki Спасибо, он напрямую отвечает на вопрос. Но, можете ли вы дать мне разумное значение для этого правила? –