将删除复制构造函数/赋值中断标准库操作

时间:2016-09-07 14:14:59

标签: c++ oop c++11 constructor stl

我有一些类要求他们的实例在运行时不能有类似的副本。让我们说其中一个类看起来像 -

class A{
    int id;
    int printerNum;

    bool failState = true;
    //....

public:
    //....

};

现在idprinterNum必须对每个实例都是唯一的,因为没有两个实例可以一次控制同一个打印机。 id仅在构造对象时生成,但printerNum可以更改。对于这两个要求,我提供了对构造函数和failState变量的检查,该变量从不正确初始化对象,如果发生错误,则将failState设置为true。

我还想删除复制构造函数和赋值运算符,以确保用户永远不会创建副本,只能从构造函数初始化它,以便id和printerNum保持唯一。

但在进行此更改之前,我想要问一下,这会破坏标准命名空间中可用的其他算法和容器吗?他们可能经常使用赋值运算符和复制构造函数,如果我明确删除它们会发生什么 -

// no copy
A(const A&) = delete;

// no assign
A& operator=(const A&) = delete;

如果不可能,或者有其他方法可以做到这一点,我会欢迎所有的建议。谢谢你:)

1 个答案:

答案 0 :(得分:4)

在C ++ 11中,对容器中使用的类型的要求取决于您调用的操作。 他们唯一无条件要求的是类型为Erasable,当与标准分配器一起使用时,相当于要求p->~T()格式良好且有效。

因此,当重新分配vector或使用insert的copy-construction版本时,需要copy-construction。例如,当元素插入向量的中间或对容器进行排序时,需要进行赋值。

例如,以下是vectorhttp://en.cppreference.com/w/cpp/container/vector的引用:

  

对元素施加的要求取决于实际要求   在容器上执行的操作。通常,它是必需的   元素类型是一个完整的类型,符合要求   可擦除,但许多成员函数强加了更严格的要求。