C++17 引入了 ContiguousIterator http://en.cppreference.com/w/cpp/iterator的概念。然而,似乎并没有计划让contiguous_iterator_tag(以我们现在的方式random_access_iterator_tag)报告std::iterator_traits<It>::iterator_category。
为什么contiguous_iterator_tag失踪?
是否有传统的协议来确定迭代器是否是连续的?还是编译时测试?
过去我提到,对于容器,如果有一个.data()成员可以转换为::value类型指针,并且有.size()成员可以转换为指针差异,那么应该假设容器是连续的,但我无法提取迭代器的类似特性.
一种解决方案可能是还具有data用于连续迭代器的功能。
当然 Contiguous 概念适用&(it[n]) == (&(*it)) + n于 , for all n,但这不能在编译时检查。
编辑:我发现这个视频将其置于更广泛的 C++ 概念背景中。CppCon 2016: Patrick Niedzielski撰写的“在现代多核世界中构建和扩展迭代器层次结构” 。该解决方案使用概念(Lite),但最终的想法是连续迭代器应该实现一个pointer_from函数(与我的data(...)函数相同)。
结论是概念将有助于将理论形式化,但它们并不是魔法,因为某人、某处将在连续的迭代器上定义新的特别命名的函数。该演讲概括为分段迭代器(具有相应的函数segment和local),不幸的是它没有提及跨步指针。
编辑 2020:
现在标准有
struct contiguous_iterator_tag: public random_access_iterator_tag { };