см. следующий код
struct A { using type = int; };
struct B : private A {};
struct C : B { using base_type = A; };
Все gcc 6.1, clang 3.8 и msvc 2015 update 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доusing. Поскольку он не находит его, он проверяет его в областиB, поскольку это базовый класс. И в случае, если он не найдетAв областиBs, он будет искать в областиglobal namespace. Но каким-то образомprivate inheritanceизAпоBостанавливается при втором поиске, то есть внутри областиB. Поскольку он работает с использованием имениfully qualified, это заставляет меня думать, что реальная проблема должна быть в тех же строках. - person Arunmu   schedule 04.07.2016