【发布时间】:2020-04-03 16:27:01
【问题描述】:
考虑这些类:
struct A
{
A(A &&) = default;
A &operator=(A &&) = default;
virtual void foo() = 0;
};
struct B
{
virtual void bar() = 0;
};
A 和 B 都不可复制构造(而且根本不可构造),但如果不是抽象的,B 将是可复制构造的。
是否可以编写一个类型特征来检查一个类是否有一个复制构造函数,它甚至适用于抽象类?
std::is_copy_constructible 不能在这里使用,因为抽象类是不可构造的。 std::is_copy_assignable 是一个合理的近似值,但对于具有复制构造函数但没有复制赋值的古怪类会失败,反之亦然。
为什么需要它:我有一个类似unique_ptr 的类,除其他外,它使用类型擦除来允许深度复制。深度复制(构造和赋值)要求存储的类型有一个复制构造函数。由于您可能还想在其中存储不可复制的类,因此如果其模板参数不是可复制构造的,则智能指针当前将停止可复制...如果模板参数是抽象类,即使它确实会无意中禁用复制有一个拷贝构造函数。
【问题讨论】:
-
如果一个抽象类可以复制构造,则不能保证任何继承自它的类也是如此。
-
不知道这是否可能,但您可以做的一件事是检查该类型是否具有
clone函数。这将是一个信号,您不应该复制,而是调用clone。 -
@CássioRenan 是的,但至少对于这个智能指针类,我决定忽略它。尝试使用可复制模板参数将不可复制的类放入智能指针会触发
static_assert。
标签: c++