class B {
private:
    friend class C;
    B() = default;
};
class C : public B {};
class D : public B {};
int main() {
    C {};
    D {};
    return 0;
}
  Я предположил, что, поскольку только класс C является другом B, а конструктор B является закрытым, то действительным является только класс C а D не может создавать экземпляр B Но это не так, как это работает. Где я ошибаюсь в своих рассуждениях и как добиться такого контроля над тем, какие классы могут наследовать определенную базу?
 Обновление: как отмечалось другими в комментариях, приведенный выше фрагмент работает так, как я первоначально ожидал в С++ 14, но не в С++ 17. Изменение экземпляра на C c; D d; C c; D d; Функция main() также работает, как и ожидалось, в режиме С++ 17.