为什么 std::array::begin 返回指针而不是迭代器?

问题描述 投票:0回答:2

我正在尝试构建一个嵌套迭代器模板,并依赖于具有各种特征(如

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

c++ templates iterator c++17 stdarray
2个回答
8
投票

该标准没有指定迭代器应该如何实现以及它应该是什么类型。 它只是说

std::array
是一个 ContigouslyContainer,这意味着它的迭代器是 ContigouslyIterator

事实上,像

int*
这样的指针确实满足了
std::array
迭代器的要求,所以它的实现是相当合法的。

您可以使用

std::iterator_traits
来获取
value_type
,例如:

std::iterator_traits<std::iterator_t<std::array<int, 3>>>::value_type

它也适用于指针。


6
投票

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

非正式地:

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

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

  3. 您可以复制

    int*
    到另一个
    int*

  4. 您可以使用

    std::swap
    作为类型来调用
    int*

© www.soinside.com 2019 - 2024. All rights reserved.