指针和数组上操作符[]的索引参数类型
Index parameter type for operator[] on pointers and arrays
指针操作符[]的自然形参类型是什么,如:
struct foo
{
value_t operator[](<TYPE?> i)
{ return data[i]; }
value_t * data;
};
我知道我可以输入任何整数类型,但是数组索引的自然类型是什么?不引起隐式转换的那个?
指针上的operator []
可以是任意整型表达式
一般来说,ptrdiff_t
在技术上是你想要的,如果意图是data
和data + i
是任意两个指针中的任意一个,并且指向任意内存块,因为ptrdiff_t
被定义为保存两个指针之间的差异的符号类型(然而,它不能保证不溢出:ptrdiff_t
在32位指针的机器上通常是32位,而不是下一个更高的符号整数大小)
在std::vector<T>
中,通常使用size_t
,因为std::vector
有额外的限制,指针指向块的开始,并且只允许在分配的块内索引,根据定义,该块不能大于size_t
,并且不允许有负索引。size_t
可以小于ptrdiff_t
或uintptr_t
(可以保存指针的无符号整型),例如在分段体系结构中,内存分配仅限于一个段,而指针则没有。
现在,如果意图是data
和data + i
是同一块内存的一部分,但不一定是data + i >= data
,那么我不认为有一个完全合适的自然数据类型(即size_t
的签名对应)…我可能是错的)在标准c++ (ssize_t
是一个POSIX扩展),但你可以用ptrdiff_t
,因为它保证至少和你想要的一样大。
不能保证sizeof(long)
或sizeof(int)
与sizeof(ptrdiff_t)
或sizeof(size_t)
有任何关系…这样做会导致严重的bug。
EDIT:从技术上讲,没有可移植的方法来获得data
和i
,这样data
和data + i
都是有效的指针,并且指向不同分配块中的不同对象,因为标准只保证指针算法在分配块中定义良好,所以如果您依赖于这样做,那么您的程序无论如何都是不可移植的。(不是说它不工作,在大多数情况下…)
- 在索引和值类型上参数化的惯用向量类型
- 在运行时C++11 个索引模板参数包,以便访问第 N 种类型
- 如何获取参数包中元素的索引
- std::ios_base::register_callback 的索引参数有什么作用?
- 使用查找表选择具有运行时索引的可变参数类型
- 从 1 中创建新的字符 * 作为参数,元素位于 2 个索引之间
- 从常量字符*参数中取出索引
- 如何使用函数参数中的int指针来获取2d数组中最大值的索引并返回指针
- 通过const函数中的参数索引返回std :: map的值
- 在gldrawelements中,索引参数的含义是什么
- 如何在可变参数模板中使用索引
- 有效地将参数包的大小提高到某个索引
- 根据给定的索引集获取参数包的子集
- 可变参数模板类,从其参数列表中获取特定类型的索引
- 将 char 数组作为参数传递时,为什么索引中不包含 null 终止符?
- 带有1个参数的C++2D数组索引(为什么这样做?)
- 通过带有数组索引的类传递参数
- 获取索引时qmodelindex的父参数
- 指针和数组上操作符[]的索引参数类型
- 使用Variadic模板解压缩参数列表时获取参数索引