为什么插入在一个向量的开始是有效的,但未指明

Why inserting at beginning of a vector is valid but unspecified?

本文关键字:有效 开始 向量 插入 一个 为什么      更新时间:2023-10-16

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

有效但未指定

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)在pos之前插入value

为什么插入在一个向量的开始是有效的,但未指定?

它不是。

这不是链接的演示文稿所说的。该演示文稿试图传达的是,如果在vector的开头插入一个值(更准确地说:除了end之外的任何其他位置)导致抛出,则vector将保持在未指定但有效的状态,而不是在尝试失败的操作之前回滚到vector的原始状态。

为什么它是未指定的呢?

因为标准没有要求std::vector必须为这种操作提供强异常安全性。__


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

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