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

标签 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 之类的特征?等等?

最佳答案

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

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

关于c++ - 为什么 std::array::begin 不返回迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62020083/

相关文章:

c++ - 在数组C++中读取数组内部的项目

c++ - C/C++ 头文件和实现文件 : How do they work?

c++ - 使用 const 引用删除引用

c++ - 为什么迭代器使用前缀增量形式?

c++ - 使用迭代器和索引访问 vector 元素有什么区别?

c++ - VS C++ ASM 到 GCC ASM

c++ - C++中的模板化全局结构

c++ - 从模板参数继承是不好的做法吗?

c++ - 使用SFINAE计算不同元素的大小

java - 获取LinkedHashMap的一个子集并保留顺序