为什么std :: vector需要operator =

zor*_*rio 5 c++ stl

我有一个关于我们可以存储在vector中的类的问题.可以存储在向量中的要求是什么?似乎这样的类必须有赋值运算符.但我不确定这是不是全部.

让我给你举个例子.A类有const int成员.如果我不写operator =,它不会编译.但在此示例中,此运算符不执行任何操作.该程序正确显示10和20.看起来operator =是必需的,但实际上并未使用.

#include <iostream>
#include <vector>

class A {
 public:
  A(int a) : a_(a) {}
  A& operator =(const A& a2) { return *this;} // Without this, compile fails.
  void print() const {
    std::cerr << a_ << std::endl;
  }
 private:
  const int a_;
};

int main(int argc, char** argv) {
  std::vector<A> v;
  v.push_back(A(10));
  v.push_back(A(20));
  for (const A& a : v) a.print();
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*tos 5

这可能会让你感到惊讶

v.push_back(A(20));
v.push_back(A(10));
std::sort(begin(v), end(v));
Run Code Online (Sandbox Code Playgroud)

矢量本身的某些方面需要可分配性,虽然我不知道,但是(我无法通过编译代码来判断,因为我的编译器在删除时不会抱怨operator=()).根据维基百科(参考'03标准的相关部分),元素必须是CopyConstructibleAssignable.

编辑:一天之后再回到这一点,在std::vector需要的时候看起来很明显Assignable- 任何时候都必须移动元素.例如,添加对v.insert()或的调用v.erase(),编译将失败.