派生类中的静态方法可以调用 C++ 中受保护的构造函数吗?
这段代码适用于 clang 但 g++ 说:
错误:“A::A()”受保护
class A
{
protected:
A() {}
};
class B : public A
{
static A f() { return A(); } // GCC claims this is an error
};
哪个编译器是正确的?
This code works with clang but g++ says:
error: ‘A::A()’ is protected
class A
{
protected:
A() {}
};
class B : public A
{
static A f() { return A(); } // GCC claims this is an error
};
Which compiler is right?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
g++ 是对的。
C++ 标准 §11.5/1 规定“<...> 访问必须通过指向、引用或派生类本身的对象<...>” ”。对于构造函数,这意味着仅允许
B
调用A
的受保护构造函数来构造其自己的基础子对象。检查 g++ 中的此相关问题。它被关闭,因为不是一个错误。
g++ is right.
The C++ Standard §11.5/1 says that "<...> the access must be through a pointer to, reference to, or object of the derived class itself <...>". In case of constructors, this means that
B
is allowed to call the protected constructor ofA
only in order to construct its own base subobject.Check this related issue in g++. It was closed as not a bug.