将空范围传递给带有一对迭代器的函数的简洁方法是什么?

dpj*_*dpj 7 c++ stl c++11

我有一个函数,需要一对迭代器.我想提供一个函数的无参数版本,其行为就像传递了一个空范围一样.

具体来说,让我们说第一个功能是:

void f(vector<int>::iterator b, vector<int>::iterator e) { // impl. }
Run Code Online (Sandbox Code Playgroud)

我想写这个:

void f() { f({}, {}); }
Run Code Online (Sandbox Code Playgroud)

我在这里初始化是否正确,{},{}应该是两个默认构造的vector :: iterator类型?(它汇编).

我是否必须构造一个容器来获得一对比较相等的迭代器?

ipc*_*ipc 7

根据我的理解,这通常不能以标准的符合方式完成.

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).
Run Code Online (Sandbox Code Playgroud)

接下来尝试使用值初始化

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 
Run Code Online (Sandbox Code Playgroud)

由于我们没有更多信息vector<int>::iterator,您的方法是错误的.

您可以做的是将您更改f为模板并使用指针:

template <typename Iter>
void f(Iter b, Iter e);

int *p; f(p, p); // ok, defined for pointers
Run Code Online (Sandbox Code Playgroud)

  • 好吧,看来你是对的.所以+1并将删除我的答案 (2认同)