为什么 std::array::begin 不是 return 迭代器?

Why does std::array::begin not return an iterator?

我正在尝试构建一个嵌套的迭代器模板,并依赖于具有 value_type 等各种特征的迭代器。但事实证明,并非所有 STL 类型甚至 return 迭代器都具有这些特征。例如:

#include <array>
#include <type_traits>

template <typename T>
using iterator_t = decltype(std::declval<T>().begin());

static_assert(std::is_same_v<iterator_t<std::array<int, 3>>, int*>);

此代码编译并显示数组迭代器的实际类型是 int*。在那种情况下,我怎样才能仍然访问 value_type 等特征?

int* 迭代器,因为它满足迭代器的所有必要条件。

非正式地:

  1. 您可以推导它(除非它超过数组的最后一个元素)。

  2. 您可以增加它(因为它是数组中的指针)。

  3. 您可以复制 int*到另一个int*

  4. 您可以调用 std::swap 类型为 int*

标准没有指定迭代器应该如何实现以及它应该是什么类型。事实上像int*这样的指针确实满足了std::array的迭代器的要求,所以实现起来是很合理的。

您可以使用 std::iterator_traitsvalue_type 获取为 std::iterator_traits<iterator_t<std::array<int, 3>>>::value_type,它也适用于指针。