通常指针相减的结果应该是
如果一个数组太大(大于PTRDIFF_MAX个元素,但小于SIZE_MAX字节),两个指针之间的差值可能无法表示为std::ptrdiff_t,所以从这样的指针中减去另外一个指针的结果是不确定的。
为了避免进入未定义行为的领域,是否有另一种类型可以在不担心溢出的情况下合法地存储指针减法操作的结果(按照标准意图的术语,而不是特定/常见实现的术语)?
特别地,是否有任何保证表明
std::ptrdiff_t
,它是一个有符号的类型。然而:如果一个数组太大(大于PTRDIFF_MAX个元素,但小于SIZE_MAX字节),两个指针之间的差值可能无法表示为std::ptrdiff_t,所以从这样的指针中减去另外一个指针的结果是不确定的。
为了避免进入未定义行为的领域,是否有另一种类型可以在不担心溢出的情况下合法地存储指针减法操作的结果(按照标准意图的术语,而不是特定/常见实现的术语)?
特别地,是否有任何保证表明
std::size_t
或std::uintptr_t
适合存储这样的操作结果,而不会发生溢出、下溢或未定义行为(假设在表达式a-b中,a比b大,以防止下溢)?
a - b
必须在编译时具有某种类型。它不能是 "ptrdiff_t
如果a < b
或者a
足够接近b
以至于不会溢出ptrdiff_t
,否则就是size_t
",因为条件只能在运行时评估。 - Igor Tandetnikstd::distance
应该返回“从第一个到最后一个的跳数”,那么libcxx中是否存在“错误”? - Julius