c++ - 我可以依赖 initializer_list::const_iterator 作为普通指针吗?

标签 c++ pointers iterator initializer-list

This question表示 std::initializer_list<int>::const_iterator类型只是一个普通的 int const*指针,而是引用标准的措辞 this answer (对同一个问题)对我来说更像是一个建议而不是保证。

在我的代码中,问题发生如下:我有一个函数处理 initializer_list 的子范围。 ,在不同的情况下,我重用传递单个元素(作为单个元素范围)的便利函数中的代码:

void doStuff(int const* begin, int const* end)
{ ... do stuff ... }

  // main use; in the real code, 'init' is a parameter of a function
  std::initializer_list<int> init({1, 2, 3, 4, 5});
  doStuff(init.begin() + 1, init.end());

  // alternative use of doStuff, relies on the pointer assumption
  int x = 6;
  doStuff(&x, (&x) + 1);
}

这种构造依赖于迭代器确实是指针这一事实。它至少适用于我的 clang++ 3.9 编译器。我可以依靠它来始终工作吗,即指针假设是否可移植?保证便携?或者我应该更改 doStuff 的参数类型放入模板参数中,以确保安全?

template <typename Iterator>
void doStuff(Iterator begin, Iterator end)
{ ... do stuff ... }

最佳答案

是的,你可以依靠它,18.9 来自C++14class initializer_list 中给我们定义:

typedef const E* 迭代器; typedef const E* const_iterator;

C++ 中的其他类型不同——例如 std::vector,其中迭代器是实现定义的,有些实现使用原始指针作为迭代器,有些使用类。

关于c++ - 我可以依赖 initializer_list::const_iterator 作为普通指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44531235/

相关文章:

c++ - 如何将 Perl 正则表达式转换为与 Boost::Regex 一起使用?

c++ - boost::函数内存使用情况

c++ - 使用 C 样式链接从函数返回类模板安全吗?

c - 字符串的名称是 char 指针吗?

c++ - 智能指针 - 程序终止时的段错误

c - 如何在C中查找数组中的元素

java - 如何在不缓存 hadoop 1.0.3 的情况下多次迭代 hadoop reduce 值?

c++ - Qt QGraphicsSvgItem 缩放和调整大小

java - 流式传输迭代器的最简单方法

java - 为什么我们需要在 Java 中的 ArrayList 上使用迭代器?