这个 class 是什么意思

2022-12-28 21:42:27 +08:00
 LuckyPocketWatch

正在研究 c++标准库的代码, 我用的是 VS2019 ,在~VS 2019\Microsoft Visual Studio\VC\Tools\MSVC\14.22.27905\include\utility 文件内,有关 swap 的函数,其中一个重载如下

// FUNCTION TEMPLATE swap
template <class _Ty, size_t _Size, class> //这个 class
inline void swap(_Ty (&_Left)[_Size], _Ty (&_Right)[_Size])
    _NOEXCEPT_COND(_Is_nothrow_swappable<_Ty>::value) { // exchange arrays stored at _Left and _Right
    if (&_Left != &_Right) { // worth swapping, swap ranges
        _Ty* _First1 = _Left;
        _Ty* _Last1  = _First1 + _Size;
        _Ty* _First2 = _Right;
        for (; _First1 != _Last1; ++_First1, ++_First2) {
            _STD iter_swap(_First1, _First2);
        }
    }
}

这个 swap 函数还有个重载版本,也有这个情况

template <class _Ty, class> //这里也是同样
inline void swap(_Ty& _Left, _Ty& _Right) _NOEXCEPT_COND(is_nothrow_move_constructible_v<_Ty>&&
        is_nothrow_move_assignable_v<_Ty>) { // exchange values stored at _Left and _Right
    _Ty _Tmp = _STD move(_Left);
    _Left    = _STD move(_Right);
    _Right   = _STD move(_Tmp);
}

我像问下这个 class 是什么意思

1834 次点击
所在节点    C++
1 条回复
geelaw
2022-12-28 22:40:44 +08:00
声明一个匿名模板参数而已,等同于

int foo(int bar, int) { }

里面的第二个 int ,或者更常见的情况是

struct A
{
A operator++(int)
{
return A{};
}
};

里面的 int 。

在 Visual C++ 提供的头文件 type_traits 里面有 std::swap 的声明,那里定义了第二个类型参数的默认值,主要是用来做 SFINAE 的,因为从 C++17 开始 std::swap 只有在类型是可移动构造且可移动赋值时才存在。

#if _HAS_CXX17
template<class _Ty,
class = enable_if_t<is_move_constructible_v<_Ty>
&& is_move_assignable_v<_Ty>>> inline
#else
template<class _Ty,
class = void> inline
#endif
void swap(_Ty&, _Ty&)
_NOEXCEPT_COND(is_nothrow_move_constructible_v<_Ty>
&& is_nothrow_move_assignable_v<_Ty>);

假设在 C++17 模式下编译且 B 是不可移动构造的类型,则

B b;
std::swap(b, b);

会失败,因为此时 enable_if_t 会失败,从而让第二个 class 参数没有默认值,此时第二个参数无法推断,因此编译失败。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/905238

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX