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

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)并不能提供强大的异常安全保证.如果在复制期间抛出异常,则不保证它将保持其目标不变


R S*_*ahu 8

从标准:

25.3.1复制 [alg.copy]

template<class InputIterator, class OutputIterator>
   OutputIterator copy(InputIterator first, InputIterator last,
                       OutputIterator result);
Run Code Online (Sandbox Code Playgroud)

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).

  • 它不必与每个算法一起列出,之前可能有一个涵盖一组算法的一般声明.无论如何,提供强大异常保证的真正问题将是TC在这个答案中所说的 - 如果`result`是一个只写输出迭代器,就没有办法*回滚*到原始内容. (2认同)

T.C*_*.C. 8

快速搜索第25条(指定大多数标准算法的子句)表明没有效果的短语实例,并且标准将强异常安全性指定为"如果抛出异常(有/函数)没有影响".换句话说,第25条中没有任何内容具有强大的异常安全保证.

此外,怎么std::copy可能提供强大的异常安全保障?dest可以是一个不一定可读的任意输出迭代器,并且可以对写操作执行任意操作.如果是std::ostream_iterator- 如何"取消"写入流中的内容怎么办?


Nat*_*ica 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.
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)

如果在第一次执行循环后的任何时间发生异常,则格式化它的方式将改变目标.