理解移动语义(二)--延长变量的生命周期

这篇具有很好参考价值的文章主要介绍了理解移动语义(二)--延长变量的生命周期。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

代码1,无右值引用,生命周期立刻结束

代码2,有右值引用,生命周期延长到引用的生命周期结束时

以上结论只适用于纯右值,不适用将亡值


右值引用的一个作用是延长纯右值的生命周期。对比如下的代码:

代码1,无右值引用,生命周期立刻结束

#include <iostream>

using namespace std;

class cls
{
public:
	cls(){ a = 0; cout << "construct"<<endl; }
	cls(const cls & other){ a = other.a; cout << "copy" << endl; }
	cls(cls && other) { a = other.a; cout << "move" << endl; }
	~cls(){ cout << "destruct" << endl; }
	int a;
};

cls clsGet()
{
	return cls();
}

int main()
{
	{
		clsGet();
		cout << "i.a =" << endl;
	}
	cin.get();

	return 0;
}

结果:

理解移动语义(二)--延长变量的生命周期 

可见,析构发生在i.a = 打印之前。

代码2,有右值引用,生命周期延长到引用的生命周期结束时

#include <iostream>

using namespace std;

class cls
{
public:
	cls(){ a = 0; cout << "construct"<<endl; }
	cls(const cls & other){ a = other.a; cout << "copy" << endl; }
	cls(cls && other) { a = other.a; cout << "move" << endl; }
	~cls(){ cout << "destruct" << endl; }
	int a;
};

cls clsGet()
{
	return cls();
}

int main()
{
	{
		cls i = clsGet();
		cout << "i.a =" <<i.a<< endl;
	}
	cin.get();

	return 0;
}

结果:

理解移动语义(二)--延长变量的生命周期

 可见,析构发生在打印i.a=之后,其实是花括号结束时。

以上结论只适用于纯右值,不适用将亡值

假如把clsGet函数的返回值定义为 cls &&,则clsGet返回将亡值,而不是纯右值。此时程序行为是未定义的:

cls && clsGet()
{
	return cls();
}

理解移动语义(二)--延长变量的生命周期

 文章来源地址https://www.toymoban.com/news/detail-400327.html

到了这里,关于理解移动语义(二)--延长变量的生命周期的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言变量的作用域,生命周期和链接相关

    本文介绍C语言的三个很重要的概念: 变量的作用域 变量的生命周期 变量或者函数的链接 先介绍一个概念: 翻译单元 C语言中有两种文件, 头文件.h , 代码文件.c 翻译单元指的是 包含头文件,并且将头文件展开以后的代码文件.c ,而每个翻译单元都有一个 文件作用域 ,实

    2024年02月04日
    浏览(37)
  • rust踩雷笔记3——生命周期的理解

    生命周期是rust中最难的概念——鲁迅 这一块内容即便是看rust圣经,第一遍也有点懵。今天早上二刷突然有了更直观的认识,记录一下。 概念和基本使用 生命周期就是应用的有效作用域,它的主要作用是避免悬垂引用。 悬垂引用的典型例子: 简而言之就是y引用的变量在y被

    2024年02月12日
    浏览(22)
  • 【vue2】vue生命周期的理解

    🥳博       主: 初映CY的前说(前端领域) 🌞个人信条: 想要变成得到,中间还有做到! 🤘 本文核心 :vue生命周期的介绍、vue生命周期钩子函数详解,vue生命周期的执行顺序 目录 一、生命周期介绍 二、生命周期的构成 1. 生命周期的四个阶段 : 2.八大钩子作用: 1.bef

    2024年02月02日
    浏览(42)
  • 探索Java中的静态变量与实例变量:存储区域、生命周期以及内存分配方式的区别

    🎉欢迎来到Java面试技巧专栏~探索Java中的静态变量与实例变量 ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹 ✨博客主页:IT·陈寒的博客 🎈该系列文章专栏:Java面试技巧 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏 📜 欢迎大家关注! ❤️ 在Java中,静态变量

    2024年02月12日
    浏览(23)
  • 通过用户生命周期理解业务数据(AAARR漏斗模型)

    AARRR(主要用于toC,toB可参考)对应 用户生命周期 中的5个重要环节: 获取、激活、留存、收益、推荐。 因为每个环节都只有一部分用户会进入下一环节,整体生命周期呈现出漏斗形状,所以叫 漏斗模型 。 AARRR模型的核心就是以用户为中心,以完整的用户生命周期为指导思想

    2024年02月13日
    浏览(32)
  • 通俗易懂,Spring Bean生命周期管理的理解

    目录 1、实例化阶段 2、初始化阶段 3、销毁阶段 总结 在Spring框架中, Bean是最基本的组件,它是Spring框架中的一个Java对象 。 下面通过@Bean来理解bean的生命周期: 在Spring框架中,@Bean注解用于告诉Spring框架一个方法将会返回一个对象,这个对象要注册为Spring应用上下文中的

    2024年02月21日
    浏览(30)
  • 深入理解Spring Bean生命周期及其管理机制

    Spring Framework是一种强大的Java开发框架,其中的Bean是Spring管理的对象实例。在Spring Framework中,Bean的生命周期是指Bean实例创建、初始化、使用和销毁等阶段。Spring Framework提供了一套完整的机制来管理Bean的生命周期,包括初始化和销毁方法的回调,以及Bean实例的自动装配等。

    2024年02月02日
    浏览(32)
  • 【react从入门到精通】深入理解React生命周期

    ✍创作者:全栈弄潮儿 🏡 个人主页: 全栈弄潮儿的个人主页 🏙️ 个人社区,欢迎你的加入:全栈弄潮儿的个人社区 📙 专栏地址:react从入门到精通 【分享几个国内免费可用的ChatGPT镜像】 【10几个类ChatGPT国内AI大模型】 【用《文心一言》1分钟写一篇博客简直yyds】 【用

    2024年02月03日
    浏览(40)
  • 【C语言趣味教学】(6) 作用域:局部变量 | 全局变量 | 局部变量优先原则 | 利用大括号限制作用域 | 变量的生命周期

        🔗 【C语言趣味教程】专栏介绍👈 猛戳了解!!! 0x00 引入:什么是作用域? 变量和常量在程序中都是有作用范围的,这个范围我们称之为变量的  作用域 (scope) 。 作用域也称为 \\\"定义域\\\",是程序中 定义的变量所存在的区域,出了该区域变量就不能被访问。 变量的作

    2024年02月14日
    浏览(26)
  • 【C语言趣味教程】(6) 作用域:局部变量 | 全局变量 | 局部变量优先原则 | 利用大括号限制作用域 | 变量的生命周期

        🔗 【C语言趣味教程】专栏介绍👈 猛戳了解!!! 0x00 引入:什么是作用域? 变量和常量在程序中都是有作用范围的,这个范围我们称之为变量的  作用域 (scope) 。 作用域也称为 \\\"定义域\\\",是程序中 定义的变量所存在的区域,出了该区域变量就不能被访问。 变量的作

    2024年02月14日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包