Может ли статический метод в производном классе вызвать защищенный конструктор в С++?
Этот код работает с clang, но g++ говорит:
ошибка: "A:: A() защищен
class A
{
protected:
A() {}
};
class B : public A
{
static A f() { return A(); } // GCC claims this is an error
};
Какой компилятор прав?
Ответ 1
g++ прав.
В стандарте С++ и в разделе 11.5/1 говорится, что "<... > доступ должен быть через указатель на ссылку, или объект самого производного класса <... > ". В случае конструкторов это означает, что B разрешено вызывать защищенный конструктор A только для того, чтобы построить собственный собственный подобъект.
Отметьте эту связанную с этим проблему в g++. Он был закрыт, как не ошибка.