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)都只需注意以下内容并继续:
只不过是一次历史事故阻止了使用 this 来为构造函数和普通成员函数工作。如果构造函数被称为“ctor”或“constructor”而不是由它们的类的名称来引用,这将是可行的。我们建议将此作为继承构造函数的机制。