在这段代码中,为什么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 *) {}
答案 0 :(得分:7)
相关资料载于12.9 [class.inhctor]第3段(加入突出显示):
对于继承构造函数的候选集中的每个非模板构造函数,除了没有参数的构造函数或具有单个参数的复制/移动构造函数之外,构造函数使用相同的构造函数隐式声明除非在使用声明出现的完整类中有一个用户声明的构造函数具有相同的签名,否则这些特性除外。 [...]
也就是说,默认构造函数不会被继承,除非它们有[defaultaulited]参数。如果它们有一个默认参数,那么它们是继承的,但没有默认参数,如同一段上的节点所指出的那样:
注意:不会继承默认参数。 [...]
基本上,这表示默认构造函数不是继承的。
答案 1 :(得分:0)
B中没有没有参数的构造函数,请尝试
B() : A(){}