繁体   English   中英

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

[英]Can I rely on initializer_list::const_iterator being a plain pointer?

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

在我的代码中,问题发生如下:我有一个函数处理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 ... }

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

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

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

该标准的第18.9节给出了<initializer_list>标题的概要,如下所示:

 namespace std { template<class E> class initializer_list { public: typedef E value_type; typedef const E& reference; typedef const E& const_reference; typedef size_t size_type; typedef const E* iterator; typedef const E* const_iterator; constexpr initializer_list() noexcept; constexpr size_t size() const noexcept; // number of elements constexpr const E* begin() const noexcept; // first element constexpr const E* end() const noexcept; // one past the last element }; // 18.9.3 initializer list range access template<class E> constexpr const E* begin(initializer_list<E> il) noexcept; template<class E> constexpr const E* end(initializer_list<E> il) noexcept; } 

此外, initializer_list上的begin()end()函数保证返回const E* ,我们可以从18.9.2中看到。

所以是的,你可以依靠它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM