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

tgl*_*las 3 c++ pointers iterator initializer-list

这个问题表明std::initializer_list<int>::const_iterator类型只是一个普通的int const*指针,但是这个答案(对于同一个问题)引用的标准的措辞听起来更像是一个建议,而不是对我的保证.

在我的代码中,问题发生如下:我有一个处理a的子范围的函数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);
}
Run Code Online (Sandbox Code Playgroud)

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

template <typename Iterator>
void doStuff(Iterator begin, Iterator end)
{ ... do stuff ... }
Run Code Online (Sandbox Code Playgroud)

Chr*_*son 7

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

typedef const E* iterator; typedef const E* const_iterator;

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

  • 错了,对不起!误读了标准的一部分! (2认同)