编译器: MSVC v142
所属文件: xutility
位置(行): 346
函数名称:_Offset_verifiable_v
函数描述:
该函数是一个判断函数,
当返回true
时表示可以调用_Verify_offset
函数,
当返回false
时表示不可以调用_Verify_offset
函数.备注:
想快速知道这个类干嘛用的, 到此结束, 否则可以往下看.
源码:
template <class _Iter, class = void>
struct _Offset_verifiable : false_type {};
template <class _Iter>
struct _Offset_verifiable<_Iter, void_t<decltype(_STD declval<const _Iter&>()._Verify_offset(_Iter_diff_t<_Iter>{}))>>
: true_type {};
template <class _Iter>
_INLINE_VAR constexpr bool _Offset_verifiable_v = _Offset_verifiable<_Iter>::value;
_Verify_offset(const difference_type _Off)
是一些const iterator
才会有的成员函数, 它的作用是验证_Off
参数的上边界和下边界是否出现溢出情况, 比如说:一个vector
有10个元素, 当前iterator
在第0个位置, 这是对该iterator
进行operator+=
操作,它不知道你提供的的参数是正数还是负数, 所以它要做 当前位置 + 负数 是否小于iterator第一个数
和 当前位置 + 正数 是否大于 iterator 最后一个数
得验证.
Talk is cheap. Show me the code
// CLASS TEMPLATE _Vector_const_iterator
template <class _Myvec>
class _Vector_const_iterator : public _Iterator_base { // iterator for nonmutable vector
...
void _Verify_offset(const difference_type _Off) const {
const auto _Mycont = static_cast<const _Myvec*>(this->_Getcont());
_STL_VERIFY(_Off == 0 || _Ptr, "cannot seek value-initialized vector iterator");
if (_Off < 0) {
// 验证上边界(begin 必须小于 _Off)
_STL_VERIFY(_Off >= _Mycont->_Myfirst - _Ptr, "cannot seek vector iterator before begin");
}
if (_Off > 0) {
// 验证下边界(end 必须大于 _Off )
_STL_VERIFY(_Off <= _Mycont->_Mylast - _Ptr, "cannot seek vector iterator after end");
}
}
...
};
difference_type _Off
是一个 int
类型, 一般用来确认两个iterator
之间的距离.