下溢或溢出的指针会发生什么?

时间:2015-10-18 19:57:02

标签: c++ pointers c++11 exception standards

我有一个只是原始指针包装的类。我想知道我是否可以宣布:

  • operator++()
  • operator--()
  • operator++(int)
  • operator--(int)

noexcept。这些操作符可以抛出的唯一原因是因为原始指针会抛出。所以问题是:在已经--的指针上调用0时发生了什么,以及在最大指针上调用++时发生了什么?< / p>

2 个答案:

答案 0 :(得分:5)

该标准在§5.7/ 4中规定:

  

当向指针添加或从指针中减去具有整数类型的表达式时,结果具有指针操作数的类型。如果指针操作数指向数组对象的元素,并且数组足够大,则结果指向偏离原始元素的元素,使得结果元素和原始数组元素的下标的差异等于整数表达式。 [...]此外,如果表达式P指向数组对象的最后一个元素,则表达式(P)+1指向一个超过数组对象的最后一个元素,如果表达式Q指向一个超过最后一个元素对于数组对象,表达式(Q)-1指向数组对象的最后一个元素。 如果指针操作数和结果都指向同一个数组对象的元素,或者指向数组对象的最后一个元素,则评估不应产生溢出;否则,行为未定义。

(强调我的)

§5.7/ 5中的减法可以找到类似的引用。因此,如果溢出和下溢是指针超出它们最初指向的对象边界的特殊情况,则行为将是未定义的。

我会说你可以宣布这些函数noexcept

作为旁注,标准库中类似指针的类型(如std::unique_ptr)不会将可能导致上述未定义行为的函数定义为noexcept(例如operator[] } for std::unique_ptr)由于某些实现决定在调试模式下抛出异常。

答案 1 :(得分:1)

原始指针算术不会抛出任何东西。它会让你自己搞砸。所以,是的,你可以。