在c++17中可以通过使用-声明来继承复制/移动构造函数吗?

Can copy/move constructors be inherited by using-declaration in c++17?(在c++17中可以通过使用-声明来继承复制/移动构造函数吗?)
本文介绍了在c++17中可以通过使用-声明来继承复制/移动构造函数吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

struct B {
  B(int) {}
  B(B const&) {}
};

struct D: B {
  using B::B;
};

int main(void) {
  B b(5);
  D d(b); // error
  return 0;
}

c++14在12.9[class.inhctor]/p3中明确从继承的构造函数中排除复制/移动构造函数。

对于继承的候选集中的每个非模板构造函数 构造函数,而不是没有参数的构造函数或 具有单个参数的复制/移动构造函数,则构造函数 使用相同的构造函数特征隐式声明,除非 中有一个具有相同签名的用户声明的构造函数 出现using-声明的完整类或构造函数 将是该类的默认、复制或移动构造函数。

但是我在c++17中找不到任何详细的描述,clang/GCC显示基类的复制/移动构造函数不是继承的。有没有人能提供一下标准中的解释?谢谢。

推荐答案

新措辞在[over.match.funcs]/8:

构造CV2类型的对象时,如果参数列表正好有一个参数且C是引用,则从类类型C([class.inhctor.init])继承而来的构造函数(包括从模板实例化的构造函数)的第一个参数类型为"Reference to CV1P"的构造函数将被排除在候选函数集中。[示例

struct A {
  A();                                  // #1
  A(A &&);                              // #2
  template<typename T> A(T &&);         // #3
};

struct B : A {
  using A::A;
  B(const B &);                         // #4
  B(B &&) = default;                    // #5, implicitly deleted

  struct X { X(X &&) = delete; } x;
};

extern B b1;
B b2 = static_cast<B&&>(b1);            // calls #4: #1 is not viable, #2, #3, and #5 are not candidates
struct C { operator B&&(); };
B b3 = C();                             // calls #4

-结束示例]

在您的示例中,B继承的复制构造函数被排除在候选集合之外(该构造函数有一个引用到const B类型的第一个参数,参数列表正好有一个参数-b,并且BD与引用相关)。

这篇关于在c++17中可以通过使用-声明来继承复制/移动构造函数吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

windeployqt doesn#39;t deploy qwindowsd.dll for a debug application(windeployqt不会为调试应用程序部署qwindowsd.dll)
QLineEdit: Show a processed text, not the entered one, but keep it (custom echo mode)(QLineEdit:显示已处理的文本,而不是输入的文本,但保留它(自定义回显模式))
Showing tooltip in a Qt chart with multiple y axes(在带有多个y轴的Qt图表中显示工具提示)
QTableView, how to change dragging multiple items display(QTableView,如何更改拖动多项显示)
How can I build Qt 5.13.2 with GCC 11.1 on Windows?(如何在Windows上用GCC 11.1构建Qt 5.13.2?)
singleton template as base class in C++(C++中作为基类的Singleton模板)