【发布时间】:2021-11-05 02:24:11
【问题描述】:
在下面的代码中,is_copy_constructible_v 返回 true,但 MainClass 的复制构造函数被标记为已删除。
试图调用复制构造函数是一个编译错误。
那is_copy_constructible_v怎么看不到呢?
class BaseClass {};
class MainClass : public BaseClass {
public:
MainClass(MainClass&) = delete;
MainClass(const BaseClass& rhs)
{
}
};
int main()
{
MainClass first{{}};
//This line will not compile because MainClass::MainClass(MainClass&) is a deleted function
//MainClass second{first};
auto mainclass_is_constructible = std::is_copy_constructible_v<MainClass>;
//This assert fails because is_copy_constructible_v returns true
static_assert((std::is_copy_constructible_v<MainClass>) == 0);
}
这是通过检查给定类是否可复制/可移动的单元测试发现的。
它们可以正常工作,但在实际代码中添加了 MainClass(const BaseClass& rhs) 的等效项后就不行了。
如果我们有MainClass(const BaseClass& rhs, int value),那么is_copy_constructible_v 将起作用。
如果我们也删除移动 ctor/assignment,给定 std::vector<MainClass> 会发生什么?向量会不会利用is_copy_constructible_v来检测如何操作最好,得到错误的答案?
非常感谢
【问题讨论】:
-
你没有删除
MainClass(MainClass const&)。这样就可以使用有效的复制构造函数了。 -
它是可复制的。您可以通过执行以下操作进行验证:
MainClass second{static_cast<const MainClass&>(first)};因此它调用复制构造函数而不是传递引用构造函数。即使这样做:const auto& temp = first; MainClass second{temp};也可以。 -
确实应该是
MainClass(const MainClass&)。谢谢
标签: c++ typetraits