C++ C+中的私有和默认构造函数+;第11条和gcc
代码: 和两种情况(根据gcc 4.7.2):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节,都没有提到任何关于覆盖默认构造函数的
- 若我编译这段代码(使用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