编译此代码:
#include <set>
#include <iostream>
int main(int argc, char * argv[]){
std::set<int> test;
std::cout << (test.end() == std::set<int>::iterator{}) << std::endl;
std::cout << (test.begin() == std::set<int>::iterator{}) << std::endl;
std::cout << (test.begin() == test.end()) << std::endl;
return 0;
}
它输出(在 gcc 11.1 和 clang 12.0.0 上测试):
0
0
1
...但是,如果我参考https://timsong-cpp.github.io/cppwp/n4659/iterators#forward.iterators-2
前向迭代器的 == 域是相同底层序列上的迭代器的域。但是,值初始化的迭代器可以进行比较,并且应该与相同类型的其他值初始化的迭代器进行比较。[ 注意:值初始化的迭代器的行为就像它们在同一空序列的末尾之后引用一样。— 尾注 ]
...然后std::set<int>::iterator{}
是我理解的“值初始化”(请注意,我使用临时变量得到相同的结果),我希望输出为:
1
1
1
我错过了什么?
前向迭代器的 == 域是相同底层序列上的迭代器的域。
所以...可以将来自同一序列的迭代器与==
.
但是,值初始化的迭代器可以进行比较,并且应该与相同类型的其他值初始化的迭代器进行比较。
所以...可以将两个相同类型的值初始化迭代器与==
.
注意:值初始化的迭代器的行为就像它们在同一空序列的末尾之后引用一样。
注释不是规范性的,但它描述的是对您隐藏了一些空序列,并且值初始化的迭代器的行为好像它们指的是过去这个序列的结束迭代器。
这就是说,就好像标准库为自己实例化了 astd::set<int>
并且一个值初始化的迭代器引用了.end()
那个。
注释与上述一致。如果值初始化的迭代器表现得好像它们都指向同一个序列,那么在同一点,它们将是可比较的并且比较相等。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句