VS2015 Обновление 1 ошибка, или плохо С++: Почему не может класс друга получить доступ к его защищенному другу деструктору?

Следующее выглядит как шаблон, используемый ZeroC ICE в коде, который он автоматически генерирует, и мне кажется, что они сделали синглтоны (не уверены, почему) для многих выпусков своего инструмента. У разных компиляторов нет проблем с этим, пока я не обнаружил, что Visual Studio 2015 Update 1 (версия VS 14.0.24720.00, версия VС++ 19.00.23506) испускает ошибку. Перед обновлением 1 VS2015 также не испытывал никаких проблем с ним. Я не уверен, что это ошибка (регрессия?) В компиляторе VS2015 С++ с обновлением 1 или плохой (не совместимый со стандартами) код на С++, который позволяют компилировать другие компиляторы.

Вот пример кода:

class Foo {
protected:
    virtual ~Foo() {}

    friend class Foo_init;
};

class Foo_init {
public:
    Foo init;
};

static Foo_init staticFooInit;

VS2015 Обновление 1 испускает эти ошибки:

example.cpp(13): error C2248: 'Foo::~Foo': cannot access protected member declared in class 'Foo'
example.cpp(3): note: see declaration of 'Foo::~Foo'
example.cpp(1): note: see declaration of 'Foo'

Я нашел одно (еще не получившее ответа) сообщение ZeroC ICE forum, которое, похоже, связано с этим, но в противном случае я не обнаружил в своем поиске Google ничего, что убеждает я ли это проблема компилятора или плохой код. Я признаю, что я не очень хорошо знаю ZeroC ICE и не использую классы класса С++, чтобы иметь глубокое понимание того, что вы можете и чего не можете с ними делать. Я надеюсь, что кто-то более осведомленный может пролить свет на него.

Ответ 1

Вы использовали идентификатор, начинающийся с символа подчеркивания, а затем заглавную букву. Эти имена зарезервированы для реализации, а их использование в коде пользователя - это поведение undefined.