Подтвердить что ты не робот

Может ли статический метод в производном классе вызвать защищенный конструктор в С++?

Этот код работает с clang, но g++ говорит:

ошибка: "A:: A() защищен

class A
{
protected:
    A() {}
};

class B : public A
{
    static A f() { return A(); } // GCC claims this is an error
};

Какой компилятор прав?

4b9b3361

Ответ 1

g++ прав.

В стандарте С++ и в разделе 11.5/1 говорится, что "<... > доступ должен быть через указатель на ссылку, или объект самого производного класса <... > ". В случае конструкторов это означает, что B разрешено вызывать защищенный конструктор A только для того, чтобы построить собственный собственный подобъект.

Отметьте эту связанную с этим проблему в g++. Он был закрыт, как не ошибка.