指针上的operator []的自然参数类型是什么,如:
struct foo
{
value_t operator[](<TYPE?> i)
{ return data[i]; }
value_t * data;
};
我知道我可以输入任何整数类型,但是数组索引的自然类型是什么,即。那个不会导致隐式转换的那个?
答案 0 :(得分:5)
operator []
可以是任何整数表达式
一般来说,ptrdiff_t
在技术上是你想要的,如果data
和data + i
的意图是任意两个任意指针和任意内存块,因为ptrdiff_t
被定义为用于保持两个指针之间差异的有符号类型(但是,它不能保证不会溢出:{32}指针的机器上的ptrdiff_t
通常是32位,而不是下一个签署整数尺寸更高)
在std::vector<T>
中,size_t
是(通常)使用的,因为std::vector
具有指针指向块开头的附加限制,并且仅在分配的块内允许索引,根据定义,不能大于size_t
,也不允许有负面指标。 size_t
可以小于ptrdiff_t
或uintptr_t
(可以保存指针的无符号整数类型),例如在分段体系结构中,其中内存分配仅限于一个段但指针不是
现在,如果意图是data
和data + i
是同一块记忆的一部分,但不一定是data + i >= data
的一部分,那么我不认为这是完全合适的标准C ++中的自然数据类型(即size_t
的签名对应...我可能是错的)(ssize_t
是POSIX扩展名),但是你可以使用ptrdiff_t
,因为它有保证至少与你想要的一样大。
无法保证sizeof(long)
或sizeof(int)
与sizeof(ptrdiff_t)
或sizeof(size_t)
有任何关系......假设这样会导致令人讨厌的错误。
编辑:从技术上讲,没有可移植的方式来获取data
和i
,因此data
和data + i
都是有效的指针和点对于不同分配块中的不同对象,因为标准只保证指针算法在分配的块中定义良好,所以如果你依赖这样做,那么你的程序无论如何都是不可移植的。 (并非在大多数情况下它都不起作用......)