C++11和gcc中的私有和默认构造函数

Private and default constructor in C++11 and gcc

本文关键字:默认 构造函数 gcc C++11      更新时间:2023-10-16

代码:

struct A
{
    private:
    A() = default; // Version 1.
};
struct B : public A
{};
struct C
{
    private:
    C() {}; // Version 2.
};
struct D : public C
{};
int main()
{
   B b;  // Compiles          under g++ 4.7.2
   D d;  // Compilation error under g++ 4.7.2
}

和两种情况(与gcc 4.7.2):

  • 如果我编译这个代码(使用A的构造函数的Version1),就不会有问题
  • 如果我使用第二个构造函数,gcc会告诉我D::D()是私有的

问题:如果我使用默认构造函数,为什么会出现问题?如果A具有私有构造函数,则其他类永远不能创建A的实例,甚至不能创建其派生类,而不管其构造函数实现的"默认性"如何。

对我来说,这闻起来像是GCC错误

无论是关于成员访问控制的整个第11条,还是关于默认构造函数的第8.4.2节,都没有提及覆盖默认构造函数的可访问级别。

此外,此代码不会在Clang 3.2和Intel ICC 13.0上编译。

另一方面,如果你评论X行,下面的行将而不是做你认为的:

B b(); // This will declare a function that accepts no argument
       // and returns a value of type B

如果去掉括号,应该看到弹出的问题:

B b; // ERROR: Constructor of A is private

但是,GCC 4.7.2(错误地)没有引起编译错误。这似乎在GCC 4.8.0的测试版中也没有得到修复(截至20130127版本)。