C++ 为什么std::vector::push_back需要赋值运算符

C++ 为什么std::vector::push_back需要赋值运算符,c++,vector,stl,c++03,C++,Vector,Stl,C++03,根据,要求类型T可复制插入 但是,除非我提供公共赋值运算符,否则编译以下程序时会出现失败(,GCC,Visual;两者均,而不使用c++11) std::vector::push_back(constT& value) #包括 甲级{ A&operator=(const A&rhs);//private!! }; int main(){ std::向量v; A A; v、 推回(a); } 为什么我需要提供这个赋值运算符,我的印象是复制构造已经足够了。 另外,我在标准中找不到这一点的

根据,要求类型T可复制插入

但是,除非我提供公共赋值运算符,否则编译以下程序时会出现失败(,GCC,Visual;两者均,而不使用c++11

std::vector::push_back(constT& value)
#包括
甲级{
A&operator=(const A&rhs);//private!!
};
int main(){
std::向量v;
A A;
v、 推回(a);
}
为什么我需要提供这个赋值运算符,我的印象是复制构造已经足够了。

另外,我在标准中找不到这一点的定义位置,因此如果您能指出参考文献,我将不胜感激

这适用于C++11。但是,C++03标准对可存储在容器中的类型有更严格的要求:

23.1容器要求[lib.Container.requirements]

存储在这些组件中的对象类型必须满足 可复制类型(20.1.3)的要求,以及 可分配类型的要求


这些要求在C++11中已经大大放宽,通常用在容器上执行的特定操作来表示。在该标准中,您的代码是有效的,因为唯一的要求是
A
A
CopyInsertable

@Griwes您的类型具有可访问的赋值运算符。不知道你在展示什么,除非我提供公开任务operator@Griwes这是阅读它的一种方式。另一个原因是,这段代码无法编译(OP实际上是这么说的),如果它们提供了accessibe赋值运算符,它就会编译。请创建一个有错误的,然后在您的问题中显示出来。另外,请编辑您的问题,以包括完整且未经编辑的错误日志。@PiotrS。不,没有。各位,请理解OP是在C++11之前的模式下编译的。您引用了容器要求。功能层面是否也有要求?例如,即使向量还需要可分配性,push_back是否只需要
CopyConstructable
。但正如我在回答中所说,这一切都适用于C++03。在C++11中,要求是每个操作,对于OP的代码,要求是
A
be
CopyInsertable
#include <vector>

class A {
  A& operator= (const A& rhs); //private !! 
};

int main()  {
 std::vector<A> v;
 A a;
 v.push_back(a);
}