# std::ref, std::cref

< cpp‎ | utility‎ | functional

定义于头文件 `<functional>` |  |
| (1) |
template< class T > std::reference_wrapper<T> ref( T& t ) noexcept; |  | (C++11 起) (C++20 前)
template< class T > constexpr std::reference_wrapper<T> ref( T& t ) noexcept; |  | (C++20 起)
| (2) |
template< class T > std::reference_wrapper<T> ref( std::reference_wrapper<T> t ) noexcept; |  | (C++11 起) (C++20 前)
template< class T > constexpr std::reference_wrapper<T> ref( std::reference_wrapper<T> t ) noexcept; |  | (C++20 起)
template< class T > void ref( const T&& ) = delete; | (3) | (C++11 起)
| (4) |
template< class T > std::reference_wrapper<const T> cref( const T& t ) noexcept; |  | (C++11 起) (C++20 前)
template< class T > constexpr std::reference_wrapper<const T> cref( const T& t ) noexcept; |  | (C++20 起)
| (5) |
template< class T > std::reference_wrapper<const T> cref( std::reference_wrapper<T> t ) noexcept; |  | (C++11 起) (C++20 前)
template< class T > constexpr std::reference_wrapper<const T> cref( std::reference_wrapper<T> t ) noexcept; |  | (C++20 起)
template< class T > void cref( const T&& ) = delete; | (6) | (C++11 起)

函数模板 `ref` 与 `cref` 是生成 std::reference_wrapper 类型对象的帮助函数，它们用模板实参推导确定结果的模板实参。

`T` 可为不完整类型。 | (C++20 起)

### 参数

t | - | 需要被包装的到对象的左值引用，或 std::reference_wrapper 的实例

### 返回值

1) std::reference_wrapper<T>(t)
2) t
4) std::reference_wrapper<const T>(t)
5) t
3,6) 右值引用包装器被删除。

### 示例

    #include <functional>
    #include <iostream>

    void f(int& n1, int& n2, const int& n3)
    {
        std::cout << "In function: " << n1 << ' ' << n2 << ' ' << n3 << '\n';
        ++n1; // 增加存储于函数对象的 n1 副本
        ++n2; // 增加 main() 的 n2
        // ++n3; // 编译错误
    }

    int main()
    {
        int n1 = 1, n2 = 2, n3 = 3;
        std::function<void()> bound_f = std::bind(f, n1, std::ref(n2), std::cref(n3));
        n1 = 10;
        n2 = 11;
        n3 = 12;
        std::cout << "Before function: " << n1 << ' ' << n2 << ' ' << n3 << '\n';
        bound_f();
        std::cout << "After function: " << n1 << ' ' << n2 << ' ' << n3 << '\n';
    }

输出：

    Before function: 10 11 12
    In function: 1 11 12
    After function: 10 12 12

### 缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

DR | 应用于 | 出版时的行为 | 正确行为
--- | --- | --- | ---
LWG 3146 | C++11 | 解包装重载有时导致错误 | 使之始终合法

### 参阅

reference_wrapper (C++11) | 可复制构造 (CopyConstructible) 且可复制赋值 (CopyAssignable) 的引用包装器 (类模板)