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
解答
该语法是什么
这是C++17引入的类模板推导指引(Class Template Deduction Guide)。它的作用是告诉编译器:当你用一个_Ty&类型的参数直接构造reference_wrapper对象时,自动推导模板参数为_Ty,生成reference_wrapper<_Ty>类型的实例。比如写int x; reference_wrapper(x);,编译器会自动推导出这是reference_wrapper<int>,无需显式指定模板参数。是否是拷贝构造函数
不是。拷贝构造函数的作用是用同类型的对象构造新对象,声明形式通常是reference_wrapper(const reference_wrapper&)(或带其他cv限定符)。而这段代码是推导指引,它本身不是构造函数,只是给编译器提供推导模板参数的规则,用来匹配类中已有的构造函数(比如代码里的模板构造函数)。搜索关键词
- 英文关键词:
C++ Class Template Deduction Guide、reference_wrapper deduction guide - 中文关键词:
C++ 类模板推导指引
内容的提问来源于stack exchange,提问作者jcxz
相关产品推荐
相关产品推荐

