当第一个< = last未满足时,C ++标准对算法说了什么?

时间:2016-09-03 18:04:40

标签: c++ algorithm language-lawyer undefined-behavior c++-standard-library

当条件first未满足时,官方C ++标准对算法说了什么,lastrequires是传递给标准算法之一的迭代器?

我看到三种可能性:

  • 要求算法检查条件,以便在未填满时算法不执行任何操作
  • 算法需要抛出异常
  • 这是未定义的行为,所以......任何事情都可能发生

我很困惑,因为在算法描述中,我没有看到firstlast的{​​{1}}条款。

EDIT1:这是对问题的简化。一个更精确的版本是"通过连续应用last无法从first访问operator++时算法会发生什么?

EDIT2:我问的是这个问题,因为我正在实现std::reverse的特化,我想知道我是否应该检查这个条件,或者我是否可以在{{1}时允许函数做一些完全错误的事情无法从last到达

1 个答案:

答案 0 :(得分:6)

您正在寻找的文本位于迭代器部分(强调我的):

  

[iterator.requirements.general] / 7-8

     
    

迭代器j被称为可从迭代器i到达,当且仅当存在有限的应用程序序列时     使得i == j的表达式++ i。如果j可以从i到达,则它们引用相同序列的元素。

         

在数据结构上运行的大多数库的算法模板都有使用范围的接口。     范围是一对指定计算开始和结束的迭代器。范围[i,i)是一个     空的范围; 通常,范围[i,j]是指以元素开头的数据结构中的元素     由i指向但不包括j指向的元素。范围[i,j]有效且当且仅当     j可以从i到达。将库中的函数应用于无效范围的结果未定义。

  

标准明确指出,将无效(未实现)范围传递给标准算法会导致未定义的行为。算法本身确实以[first, last)格式指定范围。

请注意/ 7不允许交换随机访问迭代器的参数,因为您无法反复应用++first来到达last