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

9
std::vector::push_back(constT& value)

根据这里的要求,需要类型T是可拷贝插入的。

然而,使用failes编译以下程序(clang、GCC、Visual; 都没有使用c++11),除非我提供一个公共赋值运算符。

#include <vector>

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

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

为什么我需要提供这个赋值运算符,我原本以为复制构造函数就足够了。

P.S. 我找不到标准中定义这一点的地方,如果你能指出参考文献,我将不胜感激。


@Griwes,你的类型有一个可访问的赋值运算符。不确定你展示的是什么。 - juanchopanza
除非我提供公共赋值运算符,否则不要返回翻译后的文本。 - ToBe
@Griwes 这是一种阅读方式。另一种方式是,这段代码无法编译(这是 OP 实际上说的),如果他们提供一个可访问的赋值运算符,它就可以编译。 - juanchopanza
正如你所说,它需要一个CopyInsertable类型,这不是赋值。 - Mine
3
@PiotrS. 不是这样的。http://ideone.com/0t6HFs。各位,请理解OP正在以预C++11模式进行编译。 - juanchopanza
显示剩余4条评论
1个回答

12
您引用的参考文献适用于C++11。然而,C++03标准对可存储于容器中的类型有更严格的要求:

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

...

这些组件中存储的对象的类型必须满足CopyConstructible类型(20.1.3)的要求,以及可分配类型的附加要求。

(强调是我的。)这些要求在C++11中得到了大大放宽,并通常根据容器执行的特定操作来表达。 在那个标准中,您的代码将是有效的,因为唯一的要求是ACopyInsertable

1
你引用了容器的要求,那么在函数级别上是否也有要求呢?例如,即使向量需要可赋值性,push_back 只需要 CopyConstructable 是否就足够了呢? - Micha Wiedenmann
@MichaWiedenmann 不太对,要求肯定不会更少限制。但是正如我在我的回答中所说的,在C++03中使用的所有内容都适用于。在C++11中,要求是基于每个操作的,并且对于OP的代码,要求为A必须是CopyInsertable - juanchopanza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接