首页 > 其他分享 >std::move() 学习

std::move() 学习

时间:2022-11-17 22:01:06浏览次数:39  
标签:std const move back 学习 vec include

转自:https://stackoverflow.com/questions/28595117/why-can-we-use-stdmove-on-a-const-object

1.右值

int a = 10;

左值是有固定的内存地址,&a即左值的地址,我们可以把&a保存起来,后续通过&a这个地址读取、修改a的内容;而右值是一种临时的值,我们很难获取到右值的地址,如上面的10,10的地址在哪里呢,通过常规的代码是很难获取到10的内存地址的,或者即使获取到右值的地址,该地址可能很快失效了,不能后续使用了。

2.std::move

https://blog.csdn.net/zzhongcy/article/details/86747794

emplace_back必须要结合std::move强制将左值转换为右值,

  • 当自定义类A没有移动构造函数时,vec.emplace_back(std::move(a))也等效与vec.push_back(a)。

https://stackoverflow.com/questions/35404932/stdvectoremplace-back-and-stdmove,临时变量不需要std::move,emplace会直接进行完美转发构造对象,然后加入。

例子:

#include <vector>  
#include <string>  
#include <iostream>  
 
using namespace std;

int main()  
{  
    vector<string> vec{"1","2","3"};
    vector<string> v2;
    for(const auto& v:vec){
        v2.emplace_back(std::move(v));
    }
    for(const auto&v:vec){
        cout<<v<<endl;
    }
    for(const auto&v:v2){
        cout<<v<<endl;
    }
    return 0;
}

输出:

1
2
3
1
2
3

居然两个都有值,而且遍历的时候我还是const &方式,这种情况下仍然能够调用string的转移构造函数?

上述是因为const类型不会调用移动构造函数的!!!就还是拷贝构造函数。

#include <vector>  
#include <string>  
#include <iostream>  
 
using namespace std;
struct CAT
{
   CAT(){}
   CAT(const CAT&) {std::cout << "COPY"<<endl;}
   CAT(CAT&&) {std::cout << "MOVE"<<endl;}
};

int main()  
{      
    const string a("123");
    //a非const时,std::move后打印a为空
    vector<string> vec;
    vec.emplace_back(std::move(a));
    cout<<vec[0]<<"\n";
    cout<<a<<endl;

    const CAT cat;
    CAT cat2 = std::move(cat);
    return 0;
}

输出:

123
123
COPY

 CAT结构体是有移动构造函数的,但是由于是const类型,所以不会调用。

 

标签:std,const,move,back,学习,vec,include
From: https://www.cnblogs.com/BlueBlueSea/p/16901137.html

相关文章

  • Rust库学习-cipher(简单使用)
    介绍cipher是Rust的一个密码库实践Cargo.toml[dependencies]aes="0.8.2"base64="0.13.1"cipher="0.4.3"main.rsuseaes::cipher::{generic_array::Generic......
  • 面向高效网络渗透测试的强化学习
    一、本文的贡献本文提出并且评估了一个基于人工智能的PT系统————IAPTS,系统利用RL技术来学习和再现PT活动。该模块集成了工业框架,能够在未来类似的测试用例中捕获信息......
  • 2022-2023-1 20221420《计算机基础与程序设计》第十二周学习总结
    作业信息这个作业属于哪个课程:这个作业的要求在:2022-2023-1《计算机基础与程序设计》教学进程-娄老师-博客园(cnblogs.com)这个作业的目标:《C语言程序设计》第......
  • JDBC学习总结
    首先需要导包importjava.sql.*数据库的操作在写JDBC时需要抛出相应的异常或在用try方法抓住异常加载驱动Class.forName("com.mysql.jdbc.Driver");//5.0争取旧版......
  • 深度学习框架中的“自动求导”原理是什么?
        =======================================================  参考:深度学习框架——自动求导......
  • aws-学习
    https://www.stacksimplify.com/aws-eks/microservices-on-aws-eks/learn-to-deploy-microservices-on-aws-eks/https://www.iloveaws.cn/......
  • 第十二周学习笔记
    MySQL数据库系统本章讨论了MySQL关系数据库系统;介绍了MySQL并指出了它的重要性;展示了如何在Linux机器上安装和运行MySQL;演示了如何使用MySQL在命令模式和批处理模式下......
  • c#线程学习之ManualResetEvent和AutoResetEvent的区别!
    转自:https://www.cnblogs.com/jicheng/articles/5998244.html在讨论这个问题之前,我们先了解这样一种观点,线程之间的通信是通过发信号来进行沟通的。(这不是废话)   ......
  • 声网深度学习时序编码器的资源预测实践丨Dev for Dev 专栏
    本文为「DevforDev专栏」系列内容,作者为声网大后端智能运营算法团队算法工程师@黄南薰。随着深度学习技术的发展,编码器的结构在构建神经网络中成为了热门之选,在计算......
  • /lib64/libstdc++.so.6: version `CXXABI_1.3.8' not found
    /lib64/libstdc++.so.6:version`CXXABI_1.3.8'notfound(requiredby./7zz)/lib64/libstdc++.so.6:version`CXXABI_1.3.9'notfound(requiredby./7zz)最快方案......