继承构造函数与转发

普拉丹

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文档(N1890N1898)时都仅注意以下内容并继续:

只是历史性的意外,阻止了它在构造函数以及普通成员函数中的使用。如果一个构造函数被称为“ ctor”或“ constructor”,而不是通过其类的名称进行引用,那么这将奏效。我们建议将此作为继承构造函数的机制。

巴里

主要原因是完美的转发并不完美。简单的情况:

struct B {
    B(int* ) { .. }
};

现在考虑:

D d{0};

如果我们继承构造函数,则可以正常工作。如果我们完善前进,我们将尝试构造B(int ),因为0推导为int,这是一个不存在的构造函数。失败!

其他失败情况包括支撑初始化,仅声明静态const数据成员,重载函数和位域。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章