kir*_*rev 12 c++ stl exception
如果我做
std::copy(source, source + size, destination);
Run Code Online (Sandbox Code Playgroud)
我是否有强大的异常安全保障?即如果std :: copy抛出,目标保持不变?
Dre*_*ann 14
附录E:标准库异常安全从Stroustrop的C++编程语言是从他的网站上免费观看.
由此:
复制()算法(§18.6.1)并不能提供强大的异常安全保证.如果在复制期间抛出异常,则不保证它将保持其目标不变
从标准:
25.3.1复制 [alg.copy]
Run Code Online (Sandbox Code Playgroud)template<class InputIterator, class OutputIterator> OutputIterator copy(InputIterator first, InputIterator last, OutputIterator result);1种效果:在的范围内复制元件
[first,last)为范围[result,result + (last -first))从开始first和前进到last.对于每个非负整数n < (last -first),执行*(result + n) = *(first + n).2 返回:
result + (last - first).3 要求:
result不在范围内[first,last).4 复杂性:完全
last - first分配.
它不保证异常安全.它也没有指定result在范围内的行为[first,last).
快速搜索第25条(指定大多数标准算法的子句)表明没有效果的短语实例,并且标准将强异常安全性指定为"如果抛出异常(有/函数)没有影响".换句话说,第25条中没有任何内容具有强大的异常安全保证.
此外,怎么std::copy可能提供强大的异常安全保障?dest可以是一个不一定可读的任意输出迭代器,并且可以对写操作执行任意操作.如果是std::ostream_iterator- 如何"取消"写入流中的内容怎么办?
复制在25.3.1中定义为
template<class InputIterator, class OutputIterator>
OutputIterator copy(InputIterator first, InputIterator last,
OutputIterator result);
1 Effects: Copies elements in the range [first,last) into the range [result,result + (last -
first)) starting from first and proceeding to last. For each non-negative integer n < (last -
first), performs *(result + n) = *(first + n).
2 Returns: result + (last - first).
3 Requires: result shall not be in the range [first,last).
4 Complexity: Exactly last - first assignments.
Run Code Online (Sandbox Code Playgroud)
哪个可以有效地写成:
template<class InputIterator, class OutputIterator>
OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result)
{
while (first!=last) {
*result = *first;
++result; ++first;
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
如果在第一次执行循环后的任何时间发生异常,则格式化它的方式将改变目标.