我有一个函数,需要一对迭代器.我想提供一个函数的无参数版本,其行为就像传递了一个空范围一样.
具体来说,让我们说第一个功能是:
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类型?(它汇编).
我是否必须构造一个容器来获得一对比较相等的迭代器?
根据我的理解,这通常不能以标准的符合方式完成.
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)
归档时间: |
|
查看次数: |
391 次 |
最近记录: |