编译器: MSVC v142
所属文件: xutility
位置(行): 294
函数名称:_Do_unwrap_when_unverified_v
函数描述:
该函数是一个判断函数,
当返回true
时表示可以调用_Unwrapped
函数,
当返回false
时表示不可以调用_Unwrapped
函数.备注:
想快速知道这个类干嘛用的, 到此结束, 否则可以往下看.
源码:
// FUNCTION TEMPLATE _Get_unwrapped_unverified
template <class _Iter, class = bool>
struct _Do_unwrap_when_unverified : false_type {};
template <class _Iter>
struct _Do_unwrap_when_unverified<_Iter, decltype(static_cast<bool>(_Iter::_Unwrap_when_unverified))>
: bool_constant<static_cast<bool>(_Iter::_Unwrap_when_unverified)> {};
template <class _Iter>
_INLINE_VAR constexpr bool _Do_unwrap_when_unverified_v = _Do_unwrap_when_unverified<_Iter>::value;
代码中_Iter::_Unwrap_when_unverified
这个成员属性是MSVC给标准库加上去的,它在xmemory
中的struct Iterator_base0
加入这个_Unwrap_when_unverified
, 然而像_Vector_const_iterator
、_String_const_iterator
、_List_unchecked_const_iterator
、_Flist_const_iterator
这些迭代器中全部都是继承Iterator_base0
,所以这些迭代器全都默认拥有_Unwrap_when_unverified
这个成员属性, 而且这个成员属性是static
(类成员属性).
Declares to the standard library whether an iterator type wants to be “unchecked” or “unwrapped” even if it can’t be verified in advance by _Verify_range or _Verify_offset. For example, the standard containers set this to true if and only if _ITERATOR_DEBUG_LEVEL == 0. This allows an iterator type to request range checks even in release builds (as desired by gsl::span). If this member is not present, it defaults to false.
允许那些没有做_Verify_range
或者_Verify_offset
检查的Iterator
调用该模板函数去判断这个Iterator
是否可以调用_Unwrapped
函数.
这个源码没有特别的难点, 就不做过多的分析了.