概念

  • std::ref :针对std::thread,需要把实参显式转换为引用类型;
  • std::move :无条件把参数转换为右值;但是右值赋值给新变量时,实际还要看是否满足右值条件,如const std::string&& 赋值后,实际调用的是左值构造/赋值;
  • std::forward :根据实参类型决定传递给下一层function的参数类型使用;被称为完美转发 (也叫精确传递);

    std::forward比较多的是配合 T&& 使用(使用在template代码中);其作用之一是将参数本层调用传递给下一层调用。
void log_and_consume(std::string&& message) {
std::cout << "LOG: logging with rvalue\n";
consume(message);
} void log_and_consume(std::string const& message) {
std::cout << "LOG: logging with lvalue\n";
consume(message);
} int main() {
auto msg = std::string("sample message");
log_and_consume(msg);
log_and_consume("sample message");
}

期望的输出:

LOG: logging with lvalue
Consumes an lvalue
LOG: logging with rvalue
Consumes an rvalue

实际的输出:

LOG: logging with lvalue
Consumes an lvalue
LOG: logging with rvalue
Consumes an lvalue

折叠规则

template <class... Args>
void forward(Args&&... args) {
f(std::forward<Args>(args)...);
}

折叠规则为:

&& && -> &&
& && -> &
& & -> &
&& & -> &

move/forward只是执行类型转换,且在编译期间。

(C++) std::move std::forward及使用的更多相关文章

  1. C++ 11 左值,右值,左值引用,右值引用,std::move, std::foward

    这篇文章要介绍的内容和标题一致,关于C++ 11中的这几个特性网上介绍的文章很多,看了一些之后想把几个比较关键的点总结记录一下,文章比较长.给出了很多代码示例,都是编译运行测试过的,希望能用这些帮助理 ...

  2. 第28课 “共享状态”提供者(std::promise/std::package_task)

    一. std::promise和std::package_task (一)共享状态.提供者和管理者 // CLASS TEMPLATE _Promise template <class _Ty& ...

  3. C++中std::fill/std::fill_n的使用

    There is a critical difference between std::fill and memset that is very important to understand. st ...

  4. std::move()和std::forward()

    std::move(t)负责将t的类型转换为右值引用,这种功能很有用,可以用在swap中,也可以用来解决完美转发. std::move()的源码如下 template<class _Ty> ...

  5. C++11 std::move和std::forward

    下文先从C++11引入的几个规则,如引用折叠.右值引用的特殊类型推断规则.static_cast的扩展功能说起,然后通过例子解析std::move和std::forward的推导解析过程,说明std: ...

  6. item 23: 理解std::move和std::forward

    本文翻译自<effective modern C++>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 根据std::move和std::forward不 ...

  7. Item 25: 对右值引用使用std::move,对universal引用则使用std::forward

    本文翻译自<effective modern C++>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 右值引用只能绑定那些有资格被move的对象上去.如 ...

  8. 关于C++11中的std::move和std::forward

    std::move是一个用于提示优化的函数,过去的c++98中,由于无法将作为右值的临时变量从左值当中区别出来,所以程序运行时有大量临时变量白白的创建后又立刻销毁,其中又尤其是返回字符串std::st ...

  9. c++11 标准库函数 std::move 和 完美转发 std::forward

    c++11 标准库函数 std::move 和 完美转发 std::forward #define _CRT_SECURE_NO_WARNINGS #include <iostream> ...

  10. C++0x,std::move和std::forward解析

    1.std::move 1.1std::move是如何定义的 template<typename _Tp> constexpr typename std::remove_reference ...

随机推荐

  1. 《现代操作系统(中文第四版)》实验一 bash脚本实现cal

    题目大意:让你写一个bash脚本,实现与linux下cal相同的效果 学习bash语言题,除了区别和c++有亿点区别外其他都还好 1 monName=("invalid" &quo ...

  2. Java 中HashMap 详解

    本篇重点: 1.HashMap的存储结构 2.HashMap的put和get操作过程 3.HashMap的扩容 4.关于transient关键字 HashMap的存储结构 1. HashMap 总体是 ...

  3. 大家都在用MySQL count(*)统计总数,到底有什么问题?

    在日常开发工作中,我经常会遇到需要统计总数的场景,比如:统计订单总数.统计用户总数等.一般我们会使用MySQL 的count函数进行统计,但是随着数据量逐渐增大,统计耗时也越来越长,最后竟然出现慢查询 ...

  4. Windows安装Jenkins详细教程(图文教程)

    一.安装前准备 1.提前安装好jdk,可参考以下链接进行安装 Windows安装JDK详细教程(图文教程) 2.Jenkins官网下载安装包(因为本人jdk安装的是1.8,所以会和最新版jenkins ...

  5. 【Ceph】Ceph学习理解Ceph的三种存储接口:块设备、文件系统、对象存储

    文章转载自:https://blog.51cto.com/liangchaoxi/4048519

  6. git commit、git push、git pull、 git fetch、git merge 的含义与区别

    git commit:是将本地修改过的文件提交到本地库中: git push:是将本地库中的最新信息发送给远程库: git pull:是从远程获取最新版本到本地,并自动merge: git fetch ...

  7. Prometheus与服务发现

    这种按需的资源使用方式对于监控系统而言就意味着没有了一个固定的监控目标,所有的监控对象(基础设施.应用.服务)都在动态的变化.对于Prometheus这一类基于Pull模式的监控系统,显然也无法继续使 ...

  8. 6_SSM

    一. ssm整合 1.1 项目创建 1.1.1 创建Maven项目 创建一个普通的Maven-web项目,名称为ssm 记得勾选上Create from archetype然后选择后缀为maven-a ...

  9. centos 安装mysql 8.0

    在home下新建一个mysql文件夹 cd /home mkdir mysql cd mysql 1.首先上传文件,把文件传到 /home/mysql下 链接:https://pan.baidu.co ...

  10. SECS半导体设备通讯-2 HSMS通信标准

    一 HSMS通信标准概述 HSMS定义了使用 TCP/IP 作为物理传输媒质时的通信接口. HSMS使用TCP/IP流支持,提供了可靠的双向同步传输,可以用来作为SECS-I通信以及其他更高级的通信环 ...