【发布时间】:2021-05-29 00:32:24
【问题描述】:
我在cppreference 上读到过,在使用 C++20 时,可以在定义新迭代器时省略指定类型别名 reference、pointer 和 iterator_category。
在这种情况下,std::iterator_traits 中的相应别名将具有“默认”值。
这个细节对我来说有点confusing,所以我试图把这个话题分解成可以回答的问题。
所以,我的第一个问题是:
是否所有(或部分)这些“默认”别名都保证正确?
据我了解,iterator_category 标签基于 C++17 命名要求。
如果迭代器满足前向迭代器要求(但不满足双向要求),则其标记应为forward_iterator_tag。
我特别担心forward_iterator_tag 和input_iterator_tag 之间的区别。
前向迭代器必须能够在多通道算法中使用,但我认为编译器不会检查这种情况。
在某些情况下我可以知道“默认”别名是正确的(例如,输出迭代器总是被正确分类,或者默认的 reference 别名总是正确的)?
【问题讨论】:
标签: c++ iterator language-lawyer c++20