为什么在向量的开头插入有效但未指定?

时间:2016-07-03 16:27:05

标签: c++

在看了BoostCon的Sean Parent's 2016 Keynote: Better Code后,我对他提到的一段代码感到有点困惑

  

有效但未指明

std::vector<int> x = { 1, 2, 3 };
try{
  x.insert(x.begin(), 0);
} catch (...) {
  std::cout << x.size() << std::endl;
}

为什么不确定?

http://en.cppreference.com/w/cpp/container/vector/insert我们读到:

iterator insert( const_iterator pos, const T& value ); (1)

iterator insert( const_iterator pos, T&& value );      (2)
     

1-2)在value

之前插入pos

1 个答案:

答案 0 :(得分:5)

  

为什么在向量的开头插入有效但未指定?

不是。

并不是链接的演示文稿所说的。演示文稿试图表达的是,如果在向量的开头插入一个值(为了更准确:除了结尾之外的任何其他位置)会导致抛出,那么向量将保留在未指定但有效的状态 - 而不是在尝试失败的操作之前回滚到矢量最初的状态。

  

为什么不确定?

因为该标准不要求std::vector必须为此类操作提供强大的异常安全性。 †

†一般不需要它,但在这种情况下实际上可能需要它:正如bogdan在注释中指出的那样,vector实际上提供了强大的异常保证,除非异常的来源是复制构造函数或赋值运算符......(其他情况)......在元素类型为int的情况下,异常不能来自此类来源。

因此,演示文稿中给出的示例应使用某些类型T,其复制/移动构造函数或赋值可能会抛出。