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
,并且B
和D
与引用相关)。
这篇关于在c++17中可以通过使用-声明来继承复制/移动构造函数吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:在c++17中可以通过使用-声明来继承复制/移动构造函数吗?
基础教程推荐
猜你喜欢
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- 设计字符串本地化的最佳方法 2022-01-01
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- C++,'if' 表达式中的变量声明 2021-01-01
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01
- 运算符重载的基本规则和习语是什么? 2022-10-31
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01