C ++ STL的copy()异常安全性

时间:2015-03-12 17:47:16

标签: c++ exception stl

如果我这样做

std::copy(source, source + size, destination);

我是否有强大的异常安全保障?即如果std :: copy抛出,目标保持不变?

4 个答案:

答案 0 :(得分:14)

来自Stroustrop的 C ++编程语言

附录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;
}

如果在第一次执行循环后的任何时间发生异常,那么格式化它的方式将会改变目的地。