C++ C++;STL&x27;s copy()异常安全

C++ C++;STL&x27;s copy()异常安全,c++,exception,stl,C++,Exception,Stl,如果我这样做 std::copy(source, source + size, destination); 我是否有强有力的例外安全保证?也就是说,如果std::copy抛出,则目标保持不变?来自标准: 25.3.1副本 template<class InputIterator, class OutputIterator> OutputIterator copy(InputIterator first, InputIterator last,

如果我这样做

std::copy(source, source + size, destination);
我是否有强有力的例外安全保证?也就是说,如果std::copy抛出,则目标保持不变?

来自标准:

25.3.1副本

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+(最后一个-第一个)。

3要求:
结果
不应在范围内
[第一,最后)

4复杂性:精确地
last-first
分配


它没有对异常安全做出任何保证。它也没有指定如果
结果
[第一个,最后一个)
复制在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.
模板
输出迭代器副本(先输入迭代器,后输入迭代器,
输出结果);
1效果:将范围[first,last]中的元素复制到范围[result,result+(last)中-
从第一个开始,一直到最后。对于每个非负整数n<(最后-
第一个),执行*(结果+n)=*(第一个+n)。
2返回:结果+(最后一个-第一个)。
3要求:结果不应在[第一,最后]范围内。
4复杂性:完全是最后一个任务。
可以有效地写为:

template<class InputIterator, class OutputIterator>
  OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result)
{
  while (first!=last) {
    *result = *first;
    ++result; ++first;
  }
  return result;
}
模板
输出迭代器副本(输入迭代器第一,输入迭代器最后,输出迭代器结果)
{
while(第一个!=最后一个){
*结果=*第一;
++结果;++第一;
}
返回结果;
}

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

快速搜索第25条(指定大多数标准算法的条款)表明不存在短语“无效果”的实例,并且该标准将强异常安全指定为“如果抛出异常(有/函数有)则没有影响”。换句话说,第25条中的任何内容都没有强有力的异常安全保证


此外,
std::copy
怎么可能提供强大的异常安全保证呢?
dest
可以是一个不一定可读的任意输出迭代器,并且可以在写入时执行任意操作。如果它是一个
std::ostream\u迭代器
,您如何“取消写入”“流中写了什么?

< P> <强>附录E:标准库异常安全< /强> C++的程序设计语言是:

由此:

copy()
算法(§18.6.1)不提供强 异常安全保证。它不保证在发生异常时将保持其目标不变 在复制过程中抛出


请发布一个带有引用的回复。怎么可能呢?最终它必须开始接触目的地,如果中途停止工作,目的地将处于不一致状态。只需思考10秒钟。唯一可能的方法是在复制之前备份目的地。至少有理由认为这是一个糟糕的想法n如果可能的话:(1)需要分配额外的内存,(2)速度非常慢,(3)复制(备份)以及恢复(从备份)可以像最初抛出异常一样轻松抛出另一个异常。它不必与每个算法一起列出,可以在前面有一个涵盖一组算法的一般性声明。无论如何,提供强异常保证的真正问题是t.C.在回答中所说的-如果
结果
是一个只写输出迭代器,无法回滚到原始内容。即使可以回滚,也不应该尝试。如果引发第二个异常怎么办?!