_Get_unwrapped的含义?

Meaning of _Get_unwrapped?

我一直在阅读 MS STL std::inner_product source and there seems to be a bit of usage of _Get_unwrapped,也在文件的其他地方阅读。我设法找到了那东西的来源,但无法真正破译它的作用。我需要什么问题才能使用这样的东西?是否有某种 material 我可以阅读有关此类问题(或模式)的信息?为了完整起见,我粘贴了下面的代码。

#if _HAS_IF_CONSTEXPR
template <class _Iter>
_NODISCARD constexpr decltype(auto) _Get_unwrapped(_Iter&& _It) {
    // unwrap an iterator previously subjected to _Adl_verify_range or otherwise validated
    if constexpr (is_pointer_v<decay_t<_Iter>>) { // special-case pointers and arrays
        return _It + 0;
    } else if constexpr (_Unwrappable_v<_Iter>) {
        return static_cast<_Iter&&>(_It)._Unwrapped();
    } else {
        return static_cast<_Iter&&>(_It);
    }
}
#else // ^^^ _HAS_IF_CONSTEXPR / !_HAS_IF_CONSTEXPR vvv
template <class _Iter, enable_if_t<_Unwrappable_v<_Iter>, int> = 0>
_NODISCARD constexpr decltype(auto) _Get_unwrapped(_Iter&& _It) {
    // unwrap an iterator previously subjected to _Adl_verify_range or otherwise validated
    return static_cast<_Iter&&>(_It)._Unwrapped();
}

template <class _Iter, enable_if_t<!_Unwrappable_v<_Iter>, int> = 0>
_NODISCARD constexpr _Iter&& _Get_unwrapped(_Iter&& _It) {
    // (don't) unwrap an iterator previously subjected to _Adl_verify_range or otherwise validated
    return static_cast<_Iter&&>(_It);
}

template <class _Ty>
_NODISCARD constexpr _Ty* _Get_unwrapped(_Ty* const _Ptr) { // special case already-unwrapped pointers
    return _Ptr;
}
#endif // _HAS_IF_CONSTEXPR

but couldn't really decipher what does it do.

它这样做:

  • 如果迭代器参数的class是“unwrappable”(由类型特征_Unwrappable_v决定),那么函数调用_Unwrapped迭代器的成员函数,并强制转换结果对迭代器类型的右值引用和 returns that.
  • 否则,如果迭代器不是指针,那么它只是将迭代器本身转换为右值引用(本质上与 std::move 相同)并且 returns 那。
  • 否则指针按值返回

What problem do I need to have to use such a thing?

鉴于该函数是非标准的,甚至没有公开记录,因此您应该只在实现 MSVC C++ 标准库时使用它。