C ++ 11允许继承构造函数,从而避免了很多重复的事情,尤其是对于包装类之类的东西。但是,似乎您仅使用可变参数模板就已经可以实现此功能。
class B
{
public:
B(int){//do something}
B(int, char){//do something}
};
使用继承的构造函数:
class D : public B
{
public:
using B::B;
};
使用可变参数模板并转发:
class D : public B
{
public:
template <typename...Args>
D(Args&&... args) : B(std::forward<Args>(args)...)
{
}
};
尽管一致性(处理构造函数和方法的方法相同using
)和易用性是将继承的构造函数引入语言的很好原因,但还有其他原因为什么第一种解决方案应优先于第二种解决方案?我发现在讨论CWG文档(N1890和N1898)时都仅注意以下内容并继续:
只是历史性的意外,阻止了它在构造函数以及普通成员函数中的使用。如果一个构造函数被称为“ ctor”或“ constructor”,而不是通过其类的名称进行引用,那么这将奏效。我们建议将此作为继承构造函数的机制。
主要原因是完美的转发并不完美。简单的情况:
struct B {
B(int* ) { .. }
};
现在考虑:
D d{0};
如果我们继承构造函数,则可以正常工作。如果我们完善前进,我们将尝试构造B(int )
,因为0
推导为int
,这是一个不存在的构造函数。失败!
其他失败情况包括支撑初始化,仅声明静态const数据成员,重载函数和位域。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句