指针上的运算符 [] 的自然参数类型是什么,如:
struct foo
{
value_t operator[](<TYPE?> i)
{ return data[i]; }
value_t * data;
};
我知道我可以输入任何整数类型,但是数组索引的自然类型是什么,即。不会导致隐式转换的那个?
指针上的运算符 [] 的自然参数类型是什么,如:
struct foo
{
value_t operator[](<TYPE?> i)
{ return data[i]; }
value_t * data;
};
我知道我可以输入任何整数类型,但是数组索引的自然类型是什么,即。不会导致隐式转换的那个?
operator []
on 指针可以是任何整数表达式
一般来说,ptrdiff_t
从技术上讲,这是您想要的,如果意图是data
并且data + i
是任意两个任意指针中的任意两个指针和任意内存块,因为ptrdiff_t
它被定义为用于保存两个指针之间差异的有符号类型(但是,它是不保证不会溢出:ptrdiff_t
在具有 32 位指针的机器上通常是 32 位,而不是下一个更高的有符号整数大小)
In 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)
......假设这样会导致令人讨厌的错误。
编辑:从技术上讲,没有可移植的方法来获取data
andi
并且都是有效的指针data
并data + i
指向不同分配块中的不同对象,因为标准只保证指针算术在分配的块中是明确定义的,所以如果你是依靠这样做,那么您的程序无论如何都是不可移植的。(并不是说它不起作用,在大多数情况下......)