1. points
cref 是const ref的意思,常量引用。
先看一个使用例子
上面的例子中,如果没有使用ref,而是下面的形式
std::function<void()> bound_f = std::bind(f, n1, n2, n3);
bind()是一个函数模板,简单来说它可以根据一个已有的函数,生成另一个函数,但是由于bind()不知道生成的函数执行的时候传递的参数是否还有效,所以它选择按值传参而不是按引用传参即使f的定义里使用的是引用形式的入参,f也不会改变n2的值。因为
但是如果f的定义声明里不是引用形式的入参,而是下面的形式,也改变不了n2的值,因为
void f(int& n1, int n2, const int& n3);
ref()是利用模板参数推导实现的,如果你创建一个按值传参的非模板函数而想传递一个引用,ref()是做不到的。
所以有些地方使用需要通过ref来传递引用。如使用bind时,或者thread,详细情况参考下面的网址。
参考:
浅析std::ref与reference_wrapper
http://blog.youkuaiyun.com/u014645632/article/details/78966340
为什么C++11引入了std::ref?
https://www.cnblogs.com/jiayayao/p/6527713.html
关于C++ 11中std::ref的用法
http://blog.sina.com.cn/s/blog_7c4f3b160101e8yt.html
cppreference.com
http://zh.cppreference.com/w/cpp/utility/functional/ref
2. 为什么要有std::ref
除了要在上面一些场合使用std::ref来传递引用,std::ref(T) 与T&的还有一些区别:
a) 因为T&一旦创建,便不能修改
b) 不能创建T&数组
而上述两点std::ref(T)都能克服。
参考
C++ Difference between std::ref(T) andT&?