当指针下溢或上溢时会发生什么?

3
我有一个类,只是一个原始指针的包装器。我想知道是否可以声明以下内容:operator++()operator--()operator++(int)operator--(int)noexcept。这些操作符能够抛出异常唯一的原因是原始指针可能会抛出异常。所以问题是:当对已经为0的指针调用--时会发生什么?当对指向最大值的指针调用++时会发生什么?

原始指针并不在乎,但指针算术运算是被应用的。 - πάντα ῥεῖ
你可以让指针指向任何地址。如果你不拥有该内存,那么后续使用将是未定义的行为。 - NathanOliver
2个回答

5
标准在§5.7/4中规定:
当将具有整数类型的表达式添加到指针或从指针中减去时,结果具有指针操作数的类型。如果指针操作数指向数组对象的元素,并且数组足够大,则结果指向原始元素的偏移量为差值的元素。[...]此外,如果表达式P指向数组对象的最后一个元素,则表达式(P)+1指向数组对象的最后一个元素之一,如果表达式Q指向数组对象的末尾之后的位置,则表达式(Q)-1指向数组对象的最后一个元素。如果指针操作数和结果都指向同一数组对象的元素或该数组对象的最后一个元素之一,则评估不应产生溢出;否则,行为未定义。
(强调我的)
减法也可以在§5.7/5中找到类似的引用。因此,鉴于溢出和下溢是超出它们最初指向的对象范围的指针的特殊情况,行为将简单地是未定义的。
我认为你可以声明这些函数为noexcept
顺便说一句,在标准库中类似指针的类型,如std::unique_ptr,不会将可能导致上述未定义行为的函数(例如std::unique_ptroperator[])定义为noexcept,因为某些实现在调试模式下决定抛出异常。

1

原始指针算术运算不会抛出任何异常,它只会让你自己搞砸。所以,是的,你可以这样做。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接