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;
}
它有一个错误,因为比较两个不同向量的迭代器没有意义。
我查看了 N3376 的 24.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。
我有这个代码
#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;
}
它有一个错误,因为比较两个不同向量的迭代器没有意义。
我查看了 N3376 的 24.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 fromfirst
orfirst
shall be reachable fromlast
; otherwise,last
shall be reachable fromfirst
.
现在我认为 Requires 没有实现。
在这种情况下,标准状态应该是什么?
不满足requires
,这意味着代码有未定义的行为:任何事情都可能发生。
[iterator.requirements.general]:
An iterator
j
is called reachable from an iteratori
if and only if there is a finite sequence of applications of the expression++i
that makesi == 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。