据我了解,这通常不能以符合标准的方式完成。
24.2.1/5:
迭代器也可以具有不与任何序列相关联的奇异值。[ 示例:在声明未初始化的指针 x 之后(与 int* x; 一样),必须始终假定 x 具有指针的奇异值。— 结束示例]大多数表达式的结果对于奇异值是未定义的;唯一的例外是销毁持有奇异值的迭代器,将非奇异值分配给持有奇异值的迭代器,并且对于满足DefaultConstructible
要求,使用值初始化的迭代器作为复制或移动操作的源。[注意:此保证不适用于默认初始化,尽管区别仅适用于具有琐碎默认构造函数的类型,例如指针或持有指针的聚合。— 尾注] 在这些情况下,奇异值会像任何其他值一样被覆盖。可取消引用的值总是非单一的。
默认/值初始化显然与任何序列无关,因此迭代器是单数的。比较两个奇异的迭代器是未定义的行为。
std::vector<int>::iterator i;
std::vector<int>::iterator j = i; // UB, assignment of a non-a singular value
// If you pass `i` to a function, a copy is done
// which also results in UB (as in Andy's answer).
下一次尝试,使用值初始化
std::vector<int>::iterator i{};
std::vector<int>::iterator j = i; // ok, i is value-initialized
i == j; // undefined, comparison is not explicitly non-undefined behavour
i == i; // undefined, comparison is not explicitly non-undefined behavour
由于我们没有关于 的更多信息vector<int>::iterator
,因此您的方法是错误的。
您可以做的是将您的更改f
为模板并使用指针:
template <typename Iter>
void f(Iter b, Iter e);
int *p; f(p, p); // ok, defined for pointers