在这段代码中,为什么A的构造函数没有参数没有被继承?是否有一个特殊规则阻止继承没有参数的构造函数?
struct A { A(void *) {} A() {} }; class B : public A { public: using A::A; B(int x) {} }; void f() { B b(1); B b2(nullptr); B b3; // error }
clang ++ -std = c ++ 11给出了这个错误,g ++ -std = c ++ 11给出了一个非常类似的错误信息:
td.cpp:15:7: error: no matching constructor for initialization of 'B' B b3; // error ^ td.cpp:9:5: note: candidate constructor not viable: requires single argument 'x', but no arguments were provided B(int x) {} ^ td.cpp:8:14: note: candidate constructor (inherited) not viable: requires 1 argument, but 0 were provided using A::A; ^ td.cpp:2:5: note: inherited from here A(void *) {}
Dietmar Kühl.. 7
相关信息见12.9 [class.inhctor]第3段(增加了突出显示):
对于除了没有参数的构造函数或具有单个参数的复制/移动构造函数之外的候选继承构造函数集中的每个非模板构造函数,构造函数隐式声明具有相同的构造函数特征,除非存在用户声明的构造函数在使用声明出现的完整类中的相同签名.[...]
也就是说,默认构造函数不会被继承,除非它们具有[defaultaulited]参数.如果它们有一个默认参数,则它们是继承的,但没有默认参数,如同一段落上的节点所指出的:
注意:不继承默认参数.[...]
基本上,这表示默认构造函数不是继承的.