我可以依靠 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 ... }
是的,你可以依靠它,18.9 来自 C++14 为我们提供了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 中看到的。
所以是的,你可以依靠它。
相关文章:
- 修改函数中的指针(将另一个指针作为参数传递)
- 将指针分配给另一个指针时会发生什么情况?
- C++将一个指针分配给另一个指针时执行的类型检查
- 更改一个指针后更改乘法对象
- 从另一个指针指向函数的指针
- 有没有办法在同名类 (c++) 中为对象分配一个指针变量
- 为什么通过定义另一个指针单元格,整个代码停止工作?
- C:试图将指针值复制到另一个指针中,得到可修改的左值错误
- C++ typedef 函数指针,并在一个语句中声明一个指针
- 一个对象的两个指针.删除了一个指针,对象仍然存在
- 如何获得GUID编码器,如果我在IMFTransform上有一个指针?
- 我不明白我的错误需要返回一个指针数组
- 使用 SFINAE 测试是否可以将一个指针类型static_cast到另一个指针类型
- 将指针分配给另一个指针时会发生什么情况?
- 如何保存指针地址,以便另一个指针可以继续处理它
- 为什么 std::span 是一个指针 + 大小而不是两个迭代器
- 类的成员应该是一个指针
- 隐式指针变量,在自动定义中具有另一个指针变量
- 利用双重链接列表中的下一个指针
- 你能把一个指针投射到数组中吗?