为什么 ConstexprIterator 不是来自 std::array bidirectional/random-access?
Why isn't ConstexprIterator from std::array bidirectional/random-access?
我有一个适用于任意容器的库函数。基本上它打印元素。对于 bidirectional/random-access 容器,它首先打印和最后打印,仅首先打印单向。识别和使用双向性取决于工作 --container.end()
。这适用于 C++17 中的 std::array
,但在 C++20 中 std::array
具有 ConstexprIterator
而不是 LegacyRandomAccessIterator
。
看了https://en.cppreference.com/w/cpp/named_req/ConstexprIterator好像ConstexprIterator
真的没有operator--
反而和猫有关???
所以我的问题是:为什么 ConstexprIterator
不是随机访问或至少是双向的?我的意思是,如果它在编译时工作,那么它真的应该是随机访问的。
So my question is: WHY isn't ConstexprIterator random access or at least bidirectional?
因为这会阻止非随机访问或双向的迭代器成为 constexpr 迭代器。这种限制是不可取的。
这类似于 可变迭代器 和 常量迭代器 均不限于特定迭代器类别。这些是可以应用于 any 类别的迭代器的附加概念。
Reading https://en.cppreference.com/w/cpp/named_req/ConstexprIterator it seems that ConstexprIterator really doesn't have operator--
不管链接页面是否已过时(以及 non-normative 来源),这实际上是正确的。 constexpr 迭代器 不一定有运算符--.
Why ConstexprIterator from std::array isn't bidirectional/random access?
它是随机访问。标准说(最新草案):
[array.overview]
The header defines a class template for storing fixed-size sequences of objects. An array is a contiguous container.
[container.requirements.general]
A contiguous container is a container whose member types iterator and const_iterator meet the Cpp17RandomAccessIterator requirements ([random.access.iterators]) and model contiguous_iterator ([iterator.concept.contiguous]).
in c++20 std::array
has ConstexprIterator instead of LegacyRandomAccessIterator
不是“代替”。
https://en.cppreference.com/w/cpp/container/array (bold mine)
iterator
— LegacyRandomAccessIterator and ConstexprIterator (since C++20) that is a LiteralType (since C++17)
WHY isn't ConstexprIterator random access or at least bidirectional
除了 ConstexprIterator.
之外,迭代器还可以有任何迭代器类别
ConstexprIterator 要求类别所需的所有操作(迭代器声称符合)在 compile-time 工作,仅此而已。
喵!
我有一个适用于任意容器的库函数。基本上它打印元素。对于 bidirectional/random-access 容器,它首先打印和最后打印,仅首先打印单向。识别和使用双向性取决于工作 --container.end()
。这适用于 C++17 中的 std::array
,但在 C++20 中 std::array
具有 ConstexprIterator
而不是 LegacyRandomAccessIterator
。
看了https://en.cppreference.com/w/cpp/named_req/ConstexprIterator好像ConstexprIterator
真的没有operator--
反而和猫有关???
所以我的问题是:为什么 ConstexprIterator
不是随机访问或至少是双向的?我的意思是,如果它在编译时工作,那么它真的应该是随机访问的。
So my question is: WHY isn't ConstexprIterator random access or at least bidirectional?
因为这会阻止非随机访问或双向的迭代器成为 constexpr 迭代器。这种限制是不可取的。
这类似于 可变迭代器 和 常量迭代器 均不限于特定迭代器类别。这些是可以应用于 any 类别的迭代器的附加概念。
Reading https://en.cppreference.com/w/cpp/named_req/ConstexprIterator it seems that ConstexprIterator really doesn't have operator--
不管链接页面是否已过时(以及 non-normative 来源),这实际上是正确的。 constexpr 迭代器 不一定有运算符--.
Why ConstexprIterator from std::array isn't bidirectional/random access?
它是随机访问。标准说(最新草案):
[array.overview]
The header defines a class template for storing fixed-size sequences of objects. An array is a contiguous container.
[container.requirements.general]
A contiguous container is a container whose member types iterator and const_iterator meet the Cpp17RandomAccessIterator requirements ([random.access.iterators]) and model contiguous_iterator ([iterator.concept.contiguous]).
in c++20
std::array
has ConstexprIterator instead of LegacyRandomAccessIterator
不是“代替”。
https://en.cppreference.com/w/cpp/container/array (bold mine)
iterator
— LegacyRandomAccessIterator and ConstexprIterator (since C++20) that is a LiteralType (since C++17)
WHY isn't ConstexprIterator random access or at least bidirectional
除了 ConstexprIterator.
之外,迭代器还可以有任何迭代器类别ConstexprIterator 要求类别所需的所有操作(迭代器声称符合)在 compile-time 工作,仅此而已。
喵!