为什么std :: array :: begin不返回迭代器?

时间:2020-05-26 10:31:34

标签: c++ templates iterator c++17 stdarray

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

#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等特征?

2 个答案:

答案 0 :(得分:7)

该标准未指定迭代器的实现方式以及确切的类型。实际上,像int*这样的指针确实满足了std::array的迭代器的要求,因此实现是相当合法的。

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

答案 1 :(得分:5)

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

非正式地:

  1. 您可以引用(除非它已超出数组的最后一个元素)。

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

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

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