【发布时间】:2015-04-26 14:22:54
【问题描述】:
测试显示一个奇怪的行为(c++14、g++ 4.9.1、clang 3.5.5):
总结一下:
- 如果
B没有提供其他可以使用的构造函数A::A() - 如果
B提供了其他构造函数,它不能使用A::A(),但它使用A::A(whatever arguments),这是出乎意料的行为(至少对我而言)。
设置 1:
struct A {
A() {};
A(int) {}; // with or without this overload the result are the same
};
struct B : A {
using A::A;
};
B b0{}; // OK
设置 2:
struct A {
A() {}; // with a default constructor instead (empty class A)
// the results are the same
};
struct B : A {
using A::A;
B(int){}
};
B b0{}; // no matching constructor
B b1{24}; // OK
设置 3:
struct A {
A() {};
A(int) {};
};
struct B : A {
using A::A;
B(int, int){}
};
B b0{}; // no matching constructor
B b1{24}; // OK
B b2{24, 42}; // OK
为什么会发生这种情况以及如何“修复”它。
【问题讨论】:
-
默认构造函数是特殊的。您可以“修复”它,例如通过编写显式声明默认构造函数并将其默认:
B() = default;我猜默认构造函数的某些属性不能被继承构造函数“复制”,例如琐碎,因此有特殊规则。 -
@dyp 你是对的。为什么不将您的评论放入答案中? ;)
-
示例不应该是真实的。一方面,你没有继承任何东西。请创建一个MCVE。
-
sry,我输入而不是复制,修复了继承。
标签: c++ overloading c++14 inheriting-constructors