如果我这样做
std::copy(source, source + size, destination);
我是否有强大的异常安全保障?即如果std :: copy抛出,目标保持不变?
答案 0 :(得分:14)
附录E:标准库异常安全性是freely viewable from his website。
从那起:
copy()算法(第18.6.1节)不提供强 例外安全保障。如果出现异常,它不保证它会保持目标不变 在复制期间抛出
答案 1 :(得分:8)
来自标准:
25.3.1复制 [alg.copy]
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)
范围内,它也不会指定行为。
答案 2 :(得分:8)
通过第25条(指定大多数标准算法的子句)的快速搜索表明,没有短语没有效果的实例,并且该标准将强异常安全性指定为&#34;如果是抛出异常(有/函数有)没有效果&#34;。换句话说,第25条中没有任何内容具有强大的异常安全保证。
此外,std::copy
怎么可能提供强大的异常安全保障? dest
可以是任意输出迭代器,它不一定是可读的,并且可以对写操作执行任意操作。如果它是std::ostream_iterator
怎么办 - 你如何&#34;不写&#34;什么被写入流中?
答案 3 :(得分:6)
复制在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.
可以有效地写成:
template<class InputIterator, class OutputIterator>
OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result)
{
while (first!=last) {
*result = *first;
++result; ++first;
}
return result;
}
如果在第一次执行循环后的任何时间发生异常,那么格式化它的方式将会改变目的地。