是否合法对std::views::iota的end()迭代器进行解引用?
对
std::views::iota的end()迭代器解引用是否合法? 这种操作确实合法,不属于未定义行为(UB),原因如下:
- 当
std::views::iota的边界类型(Bound)与值类型(W)相同时,它的end迭代器是一个持有边界值的迭代器实例。 - 该迭代器的
operator*被明确定义为直接返回其存储的边界值,而非普通容器end迭代器那样指向无意义的尾后位置。 - 你给出的代码里,
std::views::iota(0,5)的Bound和W都是int类型,所以end迭代器存储的值就是5,解引用它会直接得到5,这是符合C++标准规定的行为。
虽然直觉上对end迭代器解引用感觉怪异——毕竟普通容器的end迭代器解引用属于UB——但iota_view作为范围适配器,其迭代器的行为是特殊设计的,和普通容器迭代器的规则不同。
示例代码:
#include <ranges> #include <iostream> int main() { auto range = std::views::iota(0, 5); std::cout << *range.end() << std::endl; // 合法,输出5 return 0; }
内容的提问来源于stack exchange,提问作者Hesky Fisher
相关产品推荐
相关产品推荐

