【问题标题】:Why std::vector::push_back needs the assignment operator为什么 std::vector::push_back 需要赋值运算符
【发布时间】:2014-09-03 08:24:43
【问题描述】:
std::vector::push_back(constT& value)

根据this 要求类型 T 是 CopyInsertable 。

但是,除非我提供公共赋值运算符,否则编译以下程序会失败(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);
}

为什么要提供这个赋值运算符,我的印象是复制构造就足够了。

附:我在标准中找不到定义这个的地方,所以如果你能指出参考,我将不胜感激

【问题讨论】:

  • @Griwes 你的类型有一个可访问的赋值运算符。不确定你展示的是什么。
  • 除非我提供公共赋值运算符
  • @Griwes 这是阅读它的一种方式。另一个是该代码无法编译(这就是 OP 实际所说的),如果它们提供了一个 accessibe 赋值运算符,它就会编译。
  • 请创建一个有错误的Minimal, Complete, and Verifiable example,然后在您的问题中显示。另外,请编辑您的问题以包含完整且未经编辑的错误日志。
  • @PiotrS。不,它没有。 ideone.com/0t6HFs。各位,请理解 OP 是在 pre-C++11 模式下编译的。

标签: c++ vector stl c++03


【解决方案1】:

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

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

...

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

(强调我的。)这些要求在 C++11 中已经大大放宽了,通常用对容器执行的特定操作来表示。在该标准中,您的代码将是有效的,因为唯一的要求是 ACopyInsertable

【讨论】:

  • 您引用了容器要求。功能层面是否也有要求?例如,即使向量还需要可分配性,push_back 是否只需要CopyConstructable
  • @MichaWiedenmann 不是真的,当然不是更少的限制性要求。但正如我在回答中所说,这一切都适用于 C++03。在 C++11 中,要求是每个操作,对于 OP 的代码,要求是 ACopyInsertable
猜你喜欢
  • 1970-01-01
  • 2014-12-19
  • 1970-01-01
  • 2019-07-10
  • 2021-10-28
  • 2019-01-01
  • 2012-12-03
  • 2014-05-29
  • 1970-01-01
相关资源
最近更新 更多