см. следующий код
struct A { using type = int; };
struct B : private A {};
struct C : B { using base_type = A; };
Все обновления gcc 6.1, clang 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
? - Если эта ошибка компиляции считается ошибкой или является краевым случаем спецификаций стандарта?