在下面的代码中,is\u copy\u constructible\u v返回true,但MainClass的复制构造函数标记为deleted
试图调用复制构造函数可能是编译错误。
那么为什么是可复制的呢
类基类{};
类main类:公共基类{
公众:
MainClass(MainClass&;)=删除;
MainClass(常量基类和rhs)
{
}
};
int main()
{
MainClass第一{{};
//由于MainClass::MainClass(MainClass&;)是一个已删除的函数,因此此行不会编译
//主类第二{第一};
自动mainclass\u可构造=标准::是否可复制\u可构造\u v<;mainclass>;;
//此断言失败,因为is_copy_constructible_v返回true
静态断言((std::is_copy_constructible_v<;MainClass>;)==0);
}
这是通过对给定类是否可复制/可移动的检查进行单元测试发现的。
它们工作得很好,但在实际代码中添加了相当于MainClass(constbaseclass&;rhs)的代码之后就不行了
相反,如果我们有main类(const BaseClass&;rhs,int value),那么是可复制的\u可构造的\u v将起作用
如果出现std::vector<;MainClass>,如果我们同时删除移动/分配?向量不会利用is\u copy\u constructible\u v来检测如何最佳运行,并收到错误的答案吗
非常感谢
MainClass有一个MainClass::MainClass(const BaseClass&;rhs),这使得从const左值构造MainClass成为可能,例如
const MainClass first{{};
//这一行将被编译,因为MainClass::MainClass(constbaseclass&;rhs)是可用的
//main类可以绑定到const BaseClass&;
主类第二{第一};
并且std::is_copy_constructible执行检查,如下所示:
提供的成员常量值等于
std::is_constructible<;T、 康斯特>;::值
注意,它正在检查T是否可以从const T&,然后它为MainClass生成true
如果将复制构造函数声明为:
MainClass(const MainClass&;)=delete;
您将得到结果false
如果出现
std::vector<;MainClass>
它将使用MainClass::MainClass(constbaseclass&;rhs)(用于推回或重新分配等)。如果不是你所期望的,你必须重新考虑设计