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

Vin*_*ent 3 c++ standards pointers exception c++11

我有一个类只是一个原始指针包装器.我想知道我是否可以申报:

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

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

Sho*_*hoe 5

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

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

(强调我的)

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

我会说你有可能宣布这些功能noexcept.

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