考虑以下代码:
class TBase {
public:
TBase();
TBase(const TBase &);
};
class TDerived: public TBase {
public:
using TBase::TBase;
};
void f() {
TBase Base;
TDerived Derived(Base); // <=== ERROR
}
Run Code Online (Sandbox Code Playgroud)
所以,我有基类和派生类,并希望使用"使用TBase :: TBase"从基类拉复制ctor,以便能够以这种方式创建派生类的实例:
TDerived Derived(Base);
Run Code Online (Sandbox Code Playgroud)
但是所有编译器都拒绝这些错误消息
7 : note: candidate constructor (the implicit copy constructor) not viable: no known conversion from 'TBase' to 'const TDerived' for 1st argument
Run Code Online (Sandbox Code Playgroud)
为什么?我究竟做错了什么?为什么"使用TBase :: TBase"在这种情况下不起作用?
更新 如何从cppreference.com解释以下代码?
struct B1 {
B1(int);
};
struct D1 : B1 {
using B1::B1;
// The set of inherited constructors is
// 1. B1(const B1&)
// 2. B1(B1&&)
// 3. B1(int)
Run Code Online (Sandbox Code Playgroud)
复制和移动consturctors(以及默认构造函数)永远不会被继承,只是因为标准这样说.所有其他构造函数都是.
对cppreference的评论是误导性的(1).标准中的相同评论说:
for 的继承构造函数的候选集是
D1B1
(强调我的).
然后标准继续说只有D1(int)构造函数实际上是继承的.复制和移动构造函数D1隐式声明为任何其他类,而不是继承.
有关详细信息,请参阅C++ 14 12.9 [class.inhctor].
(1)我提交了对cppreference的更改以希望澄清这一点.