编译器: MSVC v142
所属文件: xutility
位置(行): 377
函数名称:_Get_unwrapped_n
函数描述:
尝试提取迭代器的_Ptr
, 如果迭代器没有_ptr
则原封不动的返回这个迭代器
源码:
template <class _Iter, class _Diff,
enable_if_t<
!_Unwrappable_for_unverified_v<_Iter> //
&& ((!_Unwrappable_for_offset_v<_Iter> && is_integral_v<_Diff>) || is_same_v<_Diff, _Distance_unknown>),
int> = 0>
_NODISCARD constexpr const _Iter& _Get_unwrapped_n(const _Iter& _It, _Diff) {
// pass through lvalue iterator that doesn't participate in checking
return _It;
}
拆分理解
-
_Unwrappable_for_unverified_v
template <class _Iter> _INLINE_VAR constexpr bool _Unwrappable_for_unverified_v = _Unwrappable_v<_Iter>&& _Do_unwrap_when_unverified_v<_Iter>;
_Unwrappable_v 验证模板参数是不是一个
Iterator
.
_Do_unwrap_when_unverified_v 判断是否可以执行_Unwrapped
函数.vector<int> a {1, 2, 3, 4, 5}; vector<int> b {}; auto start_iter = a.begin(); // 生成一个 iterator: _Vector_iterator auto back_iter = back_inserter(b); // 生成一个 iterator: back_insert_iterator // Debug 模式 cout << _ITERATOR_DEBUG_LEVEL << endl; // 2 cout << _Unwrappable_for_unverified_v<decltype(start_iter)> << endl; // false cout << _Unwrappable_for_unverified_v<decltype(back_iter)> << endl; // false // Release 模式 cout << _ITERATOR_DEBUG_LEVEL << endl; // 0 cout << _Unwrappable_for_unverified_v<decltype(start_iter)> << endl; // true cout << _Unwrappable_for_unverified_v<decltype(back_iter)> << endl; // false
这个测试代码说明,当编译模式是
Debug
时,begin
和back_inserter
生成的iterator
都是不允许在未验证_Verify_range
的情况下调用iterator
的_Unwrapped
函数. 当编译模式是Release
时,begin
生成的iterator
允许在未验证_Verify_range
的情况下调用iterator
的_Unwrapped
函数, 而back_inserter
则不可以.
备注
: 这里说的不允许, 并不是真的不能调用, 而是做模板判断的时候, 它会过滤掉当前筛选. -
_Unwrappable_for_offset_v
template <class _Iter> _INLINE_VAR constexpr bool _Unwrappable_for_offset_v = _Unwrappable_v<_Iter>&& _Offset_verifiable_v<_Iter>;
_Unwrappable_v 验证模板参数是不是一个
Iterator
.
_Offset_verifiable_v 判断是否可以执行_Verify_offset
函数. -
is_integral_v
// determine whether cv-unqualified type _Ty is integral template <class _Ty> _INLINE_VAR constexpr bool _Is_integral = _Is_any_of_v<_Ty, bool, char, signed char, unsigned char, wchar_t, char16_t, char32_t, short, unsigned short, int, unsigned int, long, unsigned long, long long, unsigned long long>; template <class _Ty> _INLINE_VAR constexpr bool is_integral_v = _Is_integral<remove_cv_t<_Ty>>;
判断一个
type
是不是一个数字类型. -
is_same_v
template <class, class> _INLINE_VAR constexpr bool is_same_v = false; // determine whether arguments are the same type template <class _Ty> _INLINE_VAR constexpr bool is_same_v<_Ty, _Ty> = true;
如果第一个类型参数和第二个类型参数相同, 则会匹配到
template <class _Ty> _INLINE_VAR constexpr bool is_same_v<_Ty, _Ty> = true;
这个特化版本, 表示true
.
如果第一个类型参数和第二个类型参数不同, 则会跳过第一个匹配, 命中template <class, class> _INLINE_VAR constexpr bool is_same_v = false;
这个标准模板, 表示false
.