Ни clang
, ни g++
не компилирует этот фрагмент:
struct A{
protected:
struct B{};
};
struct D: A::B, A{};
Согласно [class.access]/7, мы имеем:
Аналогично, использование A:: B в качестве базового спецификатора хорошо сформировано, потому что D выводится из A, поэтому проверка базовых спецификаторов должна быть отложена пока не появится весь список спецификаторов базы.
Пример и приведенное выше предложение являются частью [class.access]/7, по крайней мере, с С++ 11.