std::ref 的作用

C++ 本身有引用 &,为什么 C++11 又引入了 std::ref?主要是考虑函数式编程如 std::bind 在使用时,是对参数直接拷贝,而不是引用。如下例子:

void f(int& n1, int& n2, const int& n3)
{
    std::cout << "In function: " << n1 << ' ' << n2 << ' ' << n3 << '\n';
    ++n1; // increments the copy of n1 stored in the function object
    ++n2; // increments the main()'s n2
    // ++n3; // compile error
}

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';
}

Output:

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

上述代码在执行 std::bind 后,在函数 f() 中 n1 的值仍然是 1,n2 和 n3 是修改后的值。说明 std::bind 使用的是参数的拷贝而不是引用。


   转载规则


《std::ref 的作用》 吴杭沉 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
Lambda 表达式的捕获列表 Lambda 表达式的捕获列表
捕获值列表,是 Lambda 表达式的函数体中直接使用这些值的含义,捕获值列表能捕获的值是所有在此作用域可以访问的值,包括这个作用域里面的临时变量、类的可访问成员、全局变量。捕获值的方式分两种,一种是按值捕获,一种是按引用捕获。顾名思义,按
2019-07-11
下一篇 
C++ const 与 mutable C++ const 与 mutable
const:常量,不变的 mutable:易变的。从意思上理解,可见 const 和 mutable 是一对反义词,它们都是 C++的关键字。const 成员函数不能修改调用它的对象。类的成员函数可以被声明为 const,这将使得函数的隐式
2019-06-13
  目录