首页 > 编程语言 >C++ | 2-移动

C++ | 2-移动

时间:2023-01-01 13:12:52浏览次数:44  
标签:右值 左值 C++ 引用 && 移动 swap

如何实现移动

  • 有分开的拷贝构造和移动构造函数。
  • 有swap成员函数,支持和另外一个对象快速交换成员。
  • 你的对象的名空间下,应当有一个全局的 swap 函数,调用成员函数 swap 来实现交换。支持这种用法会方便别人(包括你自己在将来)在其他对象里包含你的对象,并快速实现它们的 swap 函数。
  • 实现通用的 operator=。
  • 上面各个函数如果不抛异常的话,应当标为 noexcept。这对移动构造函数尤为重要。

移动构造函数应当从另一个对象获取资源,清空其资源,并将其 置为一个可析构的状态。

对传递左值和右值都 有效,规避if (&rhs != this) 这样的判断小技巧:

smart_ptr&
operator=(smart_ptr rhs) noexcept
{
rhs.swap(*this);
return *this;
}

(初始化参数rhs的时候,根据传入的是左值还是右值去匹配初始化)

不要返回本地变量的引用(C++11开始)

从 C++11 开始,返回值优化仍可以发生,但在没有返回值优化的情况下,编译器将 试图把本地对象移动出去,而不是拷贝出去。这一行为不需要程序员手工用 std::move 进 行干预——使用std::move 对于移动行为没有帮助,反而会影响返回值优化。

引用坍缩和完美转发

对于 template foo(T&&) 这样的代码,如果传递过去的参数是左值,T的推导结果是左值引用;如果传递过去的参数是右值,T 的推导结果是参数的类型本身(右值引用变量仍然会匹配到左值引用上)。

如果 T 是左值引用,那 T&& 的结果仍然是左值引用——即 type& && 坍缩成了 type&。 如果 T 是一个实际类型,那 T&& 的结果自然就是一个右值引用。

应对策略:std::forward

template <typename T>
void bar(T&& s)
{
foo(std::forward<T>(s));
}

因为在 T 是模板参数时,T&& 的作用主要是保持值类别进行转发,它有个名字就叫“转发 引用”(forwarding reference)。因为既可以是左值引用,也可以是右值引用,它也曾 经被叫做“万能引用”(universal reference)。 

标签:右值,左值,C++,引用,&&,移动,swap
From: https://www.cnblogs.com/JohnsonQ/p/17017974.html

相关文章

  • C++公司员工考勤管理系统[2023-01-01]
    C++公司员工考勤管理系统[2023-01-01]题目15“公司员工考勤管理系统设计”1、问题描述某公司需要存储雇员的编号、姓名、性别、所在部门,级别,并进行工资的计算。其中,雇......
  • 面试笔试刷题 C++ (持续更新)
    阅读C++语言代码输出()​​int​​​​main()​​​​{​​​​int​​​​arr[]={​​​​1​​......
  • OpenCV+yolov3实现目标检测(C++,Python)
    OpenCV+yolov3实现目标检测(C++,Python)  目标检测算法主要分为两类:一类是基于RegionProposal(候选区域)的算法,如R-CNN系算法(R-CNN,FastR-CNN,FasterR-CNN),它们是two-st......
  • C++用finally函数实现当前函数运行结束自动执行一段代码
    我们的需求可能有这样的需求,fun(){    xx;    xx;    xx;    //希望在这里能自动执行一段设定好的代码,实现一些自动清除啥啥啥的操作}核心......
  • C++11:引用限定符
    C++中有左值和右值的概念。其实,左值和右值的区分也同样适用于类对象,本文中将左值的类对象称为左值对象,将右值的类对象称为右值对象。1.C++11:引用限定符默认情况下,对于......
  • ISO C++ forbids taking the address of an unqualified or parenthesized non-static
    //model/util.h#pragmaonce#ifndef__util_h__#define__util_h__#include<chrono>#include<ctime>#include<fstream>#include<iomanip>#include<iostream>......
  • 力扣每日一题2022.12.31---2037. 使每位学生都有座位的最少移动次数
    一个房间里有n 个座位和n 名学生,房间用一个数轴表示。给你一个长度为n 的数组 seats ,其中 seats[i]是第i 个座位的位置。同时给你一个长度为n 的数组 stude......
  • 计挑-国赛-C++-5题
    这跟前面做的蓝桥杯省赛-积木画一个类型,但是递推更简单些凭什么,同样是第五题,这跟Java那边都不是一个难度的#include<iostream>#include<vector>usingnamespacestd;......
  • vscode 上创建 c/c++ 工程
    以win10x64系统为例:首先下载并安装vscode和mingw,其中这个mingw的原版编译器是个在线安装包,由于网络被墙安装会非常慢,甚至经常会出现安装中途失败的情况,因此我将以往......
  • 漫谈C++内存和OpenGL各种缓冲对象(上)
    1、C++内存管理(1)常用数据类型占用内存大小:char1字节;int4字节;short2字节;long4字节;bool1字节;float4字节;double8字节;(2)堆栈的比较 [1]堆用于动态分配内存,容量大于......