Ref 库是一个小型库,对于将引用传递给通常接受参数副本的函数模板(算法)很有用。它定义了类模板 boost::reference_wrapper<T>,两个函数 boost::ref 和 boost::cref,它们返回 boost::reference_wrapper<T> 的实例,一个函数 boost::unwrap_ref,它解包装 boost::reference_wrapper<T> 或返回对任何其他类型对象的引用,以及两个特性类 boost::is_reference_wrapper<T> 和 boost::unwrap_reference<T>。
boost::reference_wrapper<T> 的目的是包含对类型为 T 的对象的引用。它主要用于“馈送”引用给以值传递参数的函数模板(算法)。
为了支持这种用法,boost::reference_wrapper<T> 提供了一个到 T& 的隐式转换。这通常允许函数模板在未修改的情况下处理引用。
boost::reference_wrapper<T> 是 CopyConstructible 和 Assignable 的(普通引用不是 Assignable)。
表达式 boost::ref(x) 返回一个 boost::reference_wrapper<X>(x),其中 X 是 x 的类型。同样,boost::cref(x) 返回一个 boost::reference_wrapper<X const>(x)。
表达式 boost::unwrap_ref(x) 返回一个 boost::unwrap_reference<X>::type&,其中 X 是 x 的类型。
如果 T 是 reference_wrapper,则表达式 boost::is_reference_wrapper<T>::value 为 true,否则为 false。
如果 T 是 reference_wrapper,则类型表达式 boost::unwrap_reference<T>::type 为 T::type,否则为 T。
namespace boost { template<typename T> struct is_reference_wrapper; template<typename T> class reference_wrapper; template<typename T> struct unwrap_reference; template<typename T> reference_wrapper< T > const ref(T &); template<typename T> reference_wrapper< T const > const cref(T const &); template<typename T> void ref(T const &&); template<typename T> void cref(T const &&); template<typename T> unwrap_reference< T >::type & unwrap_ref(T &); }
ref 和 cref 最初是 Jaakko Järvi 的 Tuple 库的一部分。由于它们普遍有用,因此被 Peter Dimov “提升为 boost:: 状态”。Douglas Gregor 和 Dave Abrahams 贡献了 is_reference_wrapper 和 unwrap_reference。Frank Mori Hess 和 Ronald Garcia 贡献了 boost::unwrap_ref。