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.csdn.net/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&?

https://stackoverflow.com/questions/33240993/c-difference-between-stdreft-and-t/33243776#33243776?newreg=5672c9cf361c43ec87abd84889b9af0f

std::ref std::cref相关推荐

  1. C++11 std::function, std::bind, std::ref, std::cref

    C++11 std::function, std::bind, std::ref, std::cref 转自:http://www.jellythink.com/ std::function 看看这段 ...

  2. C++ std::ref() 函数使用详解

    std::ref()是C++标准库中的一个函数,定义在<functional>头文件中,它的作用是将一个对象转换成一个引用包装器(reference wrapper),以便在函数模板中使用 ...

  3. C++并发编程之std::async(), std::future, std::promise, std::packaged_task

    c++11中增加了线程,使得我们可以非常方便的创建线程,它的基本用法是这样的: void f(int n); std::thread t(f, n + 1); t.join(); 但是线程毕竟是属于比 ...

  4. C++11 并发指南四(future 详解三 std::future std::shared_future)

    上一讲<C++11 并发指南四(<future> 详解二 std::packaged_task 介绍)>主要介绍了 <future> 头文件中的 std::pack ...

  5. C++多线程编程(3) 异步操作类 std::future std::promise std::async

    C++中提供了异步操作相关的类: 1. std::future: 异步结果的传输通道,可以很方便的获取线程函数的返回值. 在C++中,如果希望获取线程函数的返回值,就不能直接通过thread.join ...

  6. C++ 并发指南< future >(3)std::future std::shared_future

    std::future介绍 简单地说,std::future 可以用来获取异步任务的结果,因此可以把它当成一种简单的线程间同步的手段. std::future 通常由某个 Provider 创建,你可 ...

  7. C++中std::sort/std::stable_sort/std::partial_sort的区别及使用

    某些算法会重排容器中元素的顺序,如std::sort.调用sort会重排输入序列中的元素,使之有序,它默认是利用元素类型的<运算符来实现排序的.也可以重载sort的默认排序,即通过sort的第三 ...

  8. of type std::bad_cast: std::bad_cast

    of type std::bad_cast: std::bad_cast 我这里的情况: 我有两个so A 和B,调用程序c B调用a ,b的cmakelist里面要加A和A的头文件: 头文件: in ...

  9. terminating with uncaught exception of type std::bad_cast: std::bad_cast

    terminating with uncaught exception of type std::bad_cast: std::bad_cast 我这里的情况: 我有两个so A 和B,调用程序c 把 ...

最新文章

  1. 融云任杰:强互动,RTC 下一个“爆点”场景 | 拟合
  2. Symantec:揭秘Hidden Lynx组织的APT***行动
  3. 一次布环境,引起的总结
  4. 聚类之K-means均值聚类
  5. linux系统适合电脑小白吗,linux小白说说用linux的感受
  6. wxWidgets:wxRearrangeDialog类用法
  7. python 字典 get(),items(),iteritems()方法
  8. Redis 05_List列表 数组 Hash散列
  9. 骗子公司陆续公布中...
  10. 技术员联盟Win11 64位官方全新旗舰版镜像V2021.08
  11. Android View框架总结(五)View布局流程之Layout
  12. paip.提升用户体验---网站导航栏的设计
  13. 重载前自增运算符和后自增运算符
  14. 区块链核心技术演进之路-共识机制演进
  15. splitcontainer控件固定Panel的大小
  16. 制作rime配色的fcitx皮肤
  17. matlab转子瞬态响应,转子热致振动现象的瞬态响应特性研究
  18. connection_reset解决方案
  19. STM32中0x1u 0u的含义
  20. PTP同步中的TAI和UTC时间

热门文章

  1. Spring Boot 2.6.1 发布:为 Spring Cloud 2021铺路!
  2. 用 IDEA 看源码的正确姿势!你掌握了吗?
  3. Redis中主、从库宕机如何恢复?
  4. 皮一皮:P没P图?傻傻分不清...
  5. 聊一聊:我退钱了!你呢?
  6. 技术选型之Docker容器引擎
  7. 10 个让你笑的合不拢嘴的 GitHub 项目!
  8. MySQL 数据库的优化,你知道有哪些?
  9. 这里有一个3天的秘境邀请!
  10. 每日一皮:曾经的你是不是也这般天真?