对于指针的减法i和j同一数组对象的元素,[expr.add#5]中的注释读取:
[ 注意:如果值i-j不在类型的可表示值范围内
std?::?ptrdiff_t,则行为未定义.- 结束说明 ]
但是给出[support.types.layout#2],其中指出(强调我的):
- 该类型
ptrdiff_t是一个实现定义的有符号整数类型,它可以保存数组对象中两个下标的差异,如[expr.add]中所述.
结果是否可能i-j不在可表示的值的范围内ptrdiff_t?
PS:如果我的问题是由于我对英语的理解不足造成的,我道歉.
编辑:相关:为什么数组的最大大小"太大"?
有没有办法在C11中从另一个指针中减去一个指针,并且总是定义结果?
如果结果不能表示为类型ptrdiff_t,则标准表示行为未定义.
我对依赖于静态断言的解决方案持开放态度,这些断言有望在现代通用32或64位环境中传递合理的实现.我想避免依赖任何类型的运行时检查的解决方案.
如果指向的类型的大小大于1,我可以静态断言size_t和ptrdiff_t具有相同数量的非填充位.这种局部解决方案依赖于我不确定的两件事,所以对此的任何反馈都会提供部分答案:
在现代通用32或64位环境中的合理实现中,可以预期ptrdiff_t具有比size_t少至少一个值位.
我对标准的理解是正确的,因为定义了两个指向大小大于1的对象的指针之间的差异,即使指针被强制转换为字符指针时,也会定义相同的差异.这种理解似乎与委员会草案中的脚注106不一致,但我的理解是脚注不是规范性的.