C++标准库 _Offset_verifiable_v

编译器: MSVC v142
所属文件: xutility
位置(行): 346
函数名称: _Offset_verifiable_v
函数描述:
该函数是一个判断函数,
当返回true时表示可以调用_Verify_offset函数,
当返回false时表示不可以调用_Verify_offset函数.

备注:
想快速知道这个类干嘛用的, 到此结束, 否则可以往下看.

源码:

template 
struct _Offset_verifiable : false_type {};

template 
struct _Offset_verifiable<_Iter, void_t()._Verify_offset(_Iter_diff_t<_Iter>{}))>>
    : true_type {};

template 
_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 _Vector_const_iterator : public _Iterator_base { // iterator for nonmutable vector
    ...

    void _Verify_offset(const difference_type _Off) const {
        const auto _Mycont = static_cast(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之间的距离.

 

参考:

difference_type

你可能感兴趣的:(C++标准库 _Offset_verifiable_v)