C++标准库 _Do_unwrap_when_unverified_v

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

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

源码:

// FUNCTION TEMPLATE _Get_unwrapped_unverified
template 
struct _Do_unwrap_when_unverified : false_type {};

template 
struct _Do_unwrap_when_unverified<_Iter, decltype(static_cast(_Iter::_Unwrap_when_unverified))>
    : bool_constant(_Iter::_Unwrap_when_unverified)> {};

template 
_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函数.

这个源码没有特别的难点, 就不做过多的分析了.

 

参考:

STL Features and Fixes in VS 2017 15.8

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