Множественное наследование позволяет получить доступ к частному члену

class A {
    public:
            int a;
};

class B: private A {
};

class C: public A {
};

class D: public B, public C {
        D() {
                B::a = 0;
        }
};

Это компилируется, хотя B частным образом наследует A. Если я удалю D наследования C, компилятор говорит, что a недоступен, как я ожидал. Так наследование C запутывает мой компилятор?

Компилятор - gcc 4.4.7

Ответ 1

Похож на подлинную ошибку компилятора, поскольку стандарт не разрешает такой доступ в

11.2 Доступность базовых классов и базовых классов

Поиск доказательств вне самого стандарта, WhozCraig уже поднял, что clang не разрешает такой доступ.

Ищете аналогичные шаблоны, которые могут быть запутаны в gcc, существует диамон-наследование с виртуальным базовым классом A, что позволило бы такой доступ, поскольку путь большинства доступа определяет, какие меры защиты применяются.