是否复制可构造类型特征给出错误答案

在下面的代码中,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&gt,如果我们同时删除移动/分配?向量不会利用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&amp,然后它为MainClass生成true

如果将复制构造函数声明为:

MainClass(const MainClass&)=delete;

您将得到结果false

如果出现std::vector<MainClass&gt

它将使用MainClass::MainClass(constbaseclass&rhs)(用于推回或重新分配等)。如果不是你所期望的,你必须重新考虑设计

发表评论