You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中reference_wrapper的箭头声明是什么?是否为拷贝构造?该搜索什么?

类模板推导指引相关疑问解答

问题背景

在MSVC标准库中遇到如下代码,想咨询:
template <class _Ty> reference_wrapper(_Ty&) -> reference_wrapper<_Ty>;
这一语法是什么?它是否是拷贝构造函数的声明?应当搜索什么内容?

代码片段:

template <class _Ty>
class reference_wrapper
#if !_HAS_CXX20
    : public _Weak_types<_Ty>
#endif // !_HAS_CXX20
{
public:
    static_assert(is_object_v<_Ty> || is_function_v<_Ty>,
        "reference_wrapper<T> requires T to be an object type or a function type.");

    using type = _Ty;

    template <class _Uty, enable_if_t<conjunction_v<negation<is_same<_Remove_cvref_t<_Uty>, reference_wrapper>>,
                                          _Refwrap_has_ctor_from<_Ty, _Uty>>,
                              int> = 0>
    _CONSTEXPR20 reference_wrapper(_Uty&& _Val) noexcept(noexcept(_Refwrap_ctor_fun<_Ty>(_STD declval<_Uty>()))) {
        _Ty& _Ref = static_cast<_Uty&&>(_Val);
        _Ptr      = _STD addressof(_Ref);
    }

    _CONSTEXPR20 operator _Ty&() const noexcept {
        return *_Ptr;
    }

    _NODISCARD _CONSTEXPR20 _Ty& get() const noexcept {
        return *_Ptr;
    }

private:
    _Ty* _Ptr{};

public:
    template <class... _Types>
    _CONSTEXPR20 auto operator()(_Types&&... _Args) const
        noexcept(noexcept(_STD invoke(*_Ptr, static_cast<_Types&&>(_Args)...))) // strengthened
        -> decltype(_STD invoke(*_Ptr, static_cast<_Types&&>(_Args)...)) {
        return _STD invoke(*_Ptr, static_cast<_Types&&>(_Args)...);
    }
};

#if _HAS_CXX17
template <class _Ty>
reference_wrapper(_Ty&) -> reference_wrapper<_Ty>;
#endif // _HAS_CXX17

解答

  1. 该语法是什么
    这是C++17引入的类模板推导指引(Class Template Deduction Guide)。它的作用是告诉编译器:当你用一个_Ty&类型的参数直接构造reference_wrapper对象时,自动推导模板参数为_Ty,生成reference_wrapper<_Ty>类型的实例。比如写int x; reference_wrapper(x);,编译器会自动推导出这是reference_wrapper<int>,无需显式指定模板参数。

  2. 是否是拷贝构造函数
    不是。拷贝构造函数的作用是用同类型的对象构造新对象,声明形式通常是reference_wrapper(const reference_wrapper&)(或带其他cv限定符)。而这段代码是推导指引,它本身不是构造函数,只是给编译器提供推导模板参数的规则,用来匹配类中已有的构造函数(比如代码里的模板构造函数)。

  3. 搜索关键词

  • 英文关键词:C++ Class Template Deduction Guide、reference_wrapper deduction guide
  • 中文关键词:C++ 类模板推导指引

内容的提问来源于stack exchange,提问作者jcxz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 17:09:33