我有一个只是原始指针包装的类。我想知道我是否可以宣布:
operator++()
operator--()
operator++(int)
operator--(int)
为noexcept
。这些操作符可以抛出的唯一原因是因为原始指针会抛出。所以问题是:在已经--
的指针上调用0
时发生了什么,以及在最大指针上调用++
时发生了什么?< / p>
答案 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)
原始指针算术不会抛出任何东西。它会让你自己搞砸。所以,是的,你可以。