【发布时间】:2015-03-13 02:58:02
【问题描述】:
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” 而不是用他们的班级名称来引用,这会奏效。我们 建议将此作为继承构造函数的机制。
【问题讨论】:
标签: c++ c++11 inheriting-constructors