C++ 标准对 std::vector<int> v1,v2; 怎么说? std::distance(v1.begin(),v2.begin())?

What does the C++ standard say about std::vector<int> v1,v2; std::distance(v1.begin(),v2.begin())?

我有这个代码

#include <vector>
#include <iostream>

int main(int argc, char* argv[])
{
   std::vector<int> v1,v2;
   std::cout << std::distance(v1.begin(),v2.begin());
   return 0;
}

它有一个错误,因为比较两个不同向量的迭代器没有意义。

我查看了 N337624.4.4 迭代器操作 第 815 页:

template<class InputIterator>
typename iterator_traits<InputIterator>::difference_type
distance(InputIterator first, InputIterator last);

Requires: If InputIterator meets the requirements of random access iterator, last shall be reachable from first or first shall be reachable from last; otherwise, last shall be reachable from first.

现在我认为 Requires 没有实现。

在这种情况下,标准状态应该是什么?

不满足requires,这意味着代码有未定义的行为:任何事情都可能发生。

[iterator.requirements.general]:

An iterator j is called reachable from an iterator i if and only if there is a finite sequence of applications of the expression ++i that makes i == j.

问题是一旦你递增 v1.begin() v1.size()-1 次,下一次递增操作会导致未定义的行为,因此无法从 v1.begin() 到达 v2.begin()。同样的论点使得 v1.begin() 无法从 v2.begin().

到达

如果您的问题是 "What happens if a condition in a Requires section is violated?",请查看 [[=​​33=]]:

Violation of the preconditions specified in a function’s Requires: paragraph results in undefined behavior unless the function’s Throws: paragraph specifies throwing an exception when the precondition is violated.

在这种情况下将是未定义的行为。因为 last 无法通过(可能重复)递增 first.

first 到达

std::distance 的一些实现中,第一个迭代器递增直到它到达第二个迭代器。计算迭代次数:

unsigned int counts = 0;
while (iter1 != iter2)
{
  ++counts;
  ++iter1;
}

如果迭代器指向不同地址空间中的容器,循环可能不会终止。使用标准中的术语,第二个迭代器不是 reachable