5

代码:

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 的构造函数的版本 1),就没有问题。
  • 如果我使用第二个构造函数,gcc 说我D::D()是私有的。

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

4

1 回答 1

5

这对我来说就像一个 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 的 beta 版本中得到修复(截至 20130127 版本)。

于 2013-02-22T17:20:20.450 回答