为什么插入在一个向量的开始是有效的,但未指明
Why inserting at beginning of a vector is valid but unspecified?
看完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
,其复制/移动构造函数或赋值可能抛出
相关文章:
- 当回溯以零开始时,如何调试崩溃
- 欧拉项目#8答案是大以获得有效答案
- 调整大小后指向元素值的指针unordered_map有效?
- 为什么是0;C++中的有效语句
- 最高有效数字侧的第N位
- GCC对可能有效的代码抛出init list生存期警告
- 有效地使用std::unordered_map来插入或增加键的值
- c++中O(n^(1/3))中一个数的除数的有效计数
- 使用无符号字符数组有效存储内存
- 自定义先决条件对移动分配运算符有效吗
- 根据用户输入用字母填充矢量,并将"开始"和"结束"放在四肢
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 有哪些有效的方法可以消除一组 100 万个字符串>重复数据?
- 如何从头开始创建 avi 文件?
- 为什么这种直接初始化有效?(C++17)
- 如何将迭代器(包括结束和开始之前的迭代器)测试到列表或forward_list保持有效
- 如何有效地从C++集中删除开始和结束元素
- 有没有有效的方法可以从现在开始生成从范围到 10 天的随机date_time
- C++函数,从double开始进行基数为10的有效+指数计算
- 为什么插入在一个向量的开始是有效的,但未指明