在看了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
答案 0 :(得分:5)
为什么在向量的开头插入有效但未指定?
不是。
并不是链接的演示文稿所说的。演示文稿试图表达的是,如果在向量的开头插入一个值(为了更准确:除了结尾之外的任何其他位置)会导致抛出,那么向量将保留在未指定但有效的状态 - 而不是在尝试失败的操作之前回滚到矢量最初的状态。
为什么不确定?
因为该标准不要求std::vector
必须为此类操作提供强大的异常安全性。 †
†一般不需要它,但在这种情况下实际上可能需要它:正如bogdan在注释中指出的那样,vector实际上提供了强大的异常保证,除非异常的来源是复制构造函数或赋值运算符......(其他情况)......在元素类型为int
的情况下,异常不能来自此类来源。
因此,演示文稿中给出的示例应使用某些类型T
,其复制/移动构造函数或赋值可能会抛出。