我有一些类要求他们的实例在运行时不能有类似的副本。让我们说其中一个类看起来像 -
class A{
int id;
int printerNum;
bool failState = true;
//....
public:
//....
};
现在id
和printerNum
必须对每个实例都是唯一的,因为没有两个实例可以一次控制同一个打印机。 id
仅在构造对象时生成,但printerNum
可以更改。对于这两个要求,我提供了对构造函数和failState
变量的检查,该变量从不正确初始化对象,如果发生错误,则将failState
设置为true。
我还想删除复制构造函数和赋值运算符,以确保用户永远不会创建副本,只能从构造函数初始化它,以便id和printerNum保持唯一。
但在进行此更改之前,我想要问一下,这会破坏标准命名空间中可用的其他算法和容器吗?他们可能经常使用赋值运算符和复制构造函数,如果我明确删除它们会发生什么 -
// no copy
A(const A&) = delete;
// no assign
A& operator=(const A&) = delete;
如果不可能,或者有其他方法可以做到这一点,我会欢迎所有的建议。谢谢你:)
答案 0 :(得分:4)
在C ++ 11中,对容器中使用的类型的要求取决于您调用的操作。
他们唯一无条件要求的是类型为Erasable
,当与标准分配器一起使用时,相当于要求p->~T()
格式良好且有效。
因此,当重新分配vector或使用insert的copy-construction版本时,需要copy-construction。例如,当元素插入向量的中间或对容器进行排序时,需要进行赋值。
例如,以下是vector
上http://en.cppreference.com/w/cpp/container/vector的引用:
对元素施加的要求取决于实际要求 在容器上执行的操作。通常,它是必需的 元素类型是一个完整的类型,符合要求 可擦除,但许多成员函数强加了更严格的要求。