为什么 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*
是迭代器,因为它满足迭代器的所有必要条件。
非正式地:
您可以推导它(除非它超过数组的最后一个元素)。
您可以增加它(因为它是数组中的指针)。
您可以复制 int*
到另一个int*
。
您可以调用 std::swap
类型为 int*
。
标准没有指定迭代器应该如何实现以及它应该是什么类型。事实上像int*
这样的指针确实满足了std::array
的迭代器的要求,所以实现起来是很合理的。
您可以使用 std::iterator_traits
将 value_type
获取为 std::iterator_traits<iterator_t<std::array<int, 3>>>::value_type
,它也适用于指针。
我正在尝试构建一个嵌套的迭代器模板,并依赖于具有 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*
是迭代器,因为它满足迭代器的所有必要条件。
非正式地:
您可以推导它(除非它超过数组的最后一个元素)。
您可以增加它(因为它是数组中的指针)。
您可以复制
int*
到另一个int*
。您可以调用
std::swap
类型为int*
。
标准没有指定迭代器应该如何实现以及它应该是什么类型。事实上像int*
这样的指针确实满足了std::array
的迭代器的要求,所以实现起来是很合理的。
您可以使用 std::iterator_traits
将 value_type
获取为 std::iterator_traits<iterator_t<std::array<int, 3>>>::value_type
,它也适用于指针。