Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的私有和默认构造函数+;第11条和gcc_C++_Inheritance_C++11_Private_Default Constructor - Fatal编程技术网

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

C++ C+中的私有和默认构造函数+;第11条和gcc,c++,inheritance,c++11,private,default-constructor,C++,Inheritance,C++11,Private,Default Constructor,代码: 和两种情况(根据gcc 4.7.2): 若我编译这段代码(使用A的构造函数的版本1),就不会有问题 如果我使用第二个构造函数,gcc会告诉我D::D()是私有的 问题:如果我使用默认构造函数,为什么问题会消失?如果A有私有构造函数,那么其他类就永远无法创建A的实例,即使是它的派生类,也无法创建它的实例,不管它的构造函数的实现是否“默认”。我觉得这闻起来像是一个GCCbug 无论是关于成员访问控制的整个第11条,还是关于默认构造函数的第8.4.2节,都没有提到任何关于覆盖默认构造函数的

代码:

和两种情况(根据gcc 4.7.2):

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

问题:如果我使用默认构造函数,为什么问题会消失?如果
A
有私有构造函数,那么其他类就永远无法创建
A
的实例,即使是它的派生类,也无法创建它的实例,不管它的构造函数的实现是否“默认”。

我觉得这闻起来像是一个GCCbug

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

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

另一方面,如果您对第X行进行注释,则下一行不会做您认为的事情:

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
}
如果删除括号,您应该会看到出现问题:

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

但是,GCC4.7.2(错误)不会引发编译错误。这似乎在GCC 4.8.0的beta版(自构建20130127起)中也没有得到修复。

第X行也没有对此进行评论?@JonathanWakely:谢谢!
B b; // ERROR: Constructor of A is private