V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
LuckyPocketWatch
V2EX  ›  C++

这个 class 是什么意思

  •  
  •   LuckyPocketWatch · 2022-12-28 21:42:27 +08:00 · 1834 次点击
    这是一个创建于 728 天前的主题,其中的信息可能已经有所发展或是发生改变。

    正在研究 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 是什么意思

    1 条回复    2022-12-28 22:40:44 +08:00
    geelaw
        1
    geelaw  
       2022-12-28 22:40:44 +08:00   ❤️ 1
    声明一个匿名模板参数而已,等同于

    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 参数没有默认值,此时第二个参数无法推断,因此编译失败。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2994 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 14:21 · PVG 22:21 · LAX 06:21 · JFK 09:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.