gpt4 book ai didi

c++ - C++11 和 gcc 中的私有(private)和默认构造函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:30:23 24 4
gpt4 key购买 nike

代码:

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() 是私有(private)的。

问题:如果我使用默认构造函数,为什么问题会消失?如果 A 具有私有(private)构造函数,则其他类永远不能创建 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 起)。

关于c++ - C++11 和 gcc 中的私有(private)和默认构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15029586/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com