函数返回右值的一点学习研究

news2024/11/15 8:43:07

https://zhuanlan.zhihu.com/p/511371573?utm_medium=social&utm_oi=939219201949429760

下面情况下不会调用:

DPoint3d fun1()
{
    return DPoint3d{1,2,3}; // 默认构造
}

int main()
{
    DPoint3d&& a = fun1();
    a.y = 20;
    int i = 0;
    ++i;
}

下面情况下,会析构:

并且有个警告,说:warning C4172: 返回局部变量或临时变量的地址

注意,是临时变量的“地址”

DPoint3d&& fun1()
{
    return DPoint3d{1,2,3}; // 编译:warning C4172: 返回局部变量或临时变量的地址
}

int main()
{
    DPoint3d&& a = fun1();
    a.y = 20;
    int i = 0;
    ++i;
}

仔细研究下,明明都被析构了,但仍然以右值的名义给带出来了,当然带出来的也是已经析构之后的变量。

但是有一个非常迷惑人的地方,刚出来的时候,还是可以赋值的,但在执行取地址的操作之后,里面的值立刻就现出原型:

struct DPoint3d
{
    //! x coordinate
    double x;
    //! y coordinate
    double y;
    //! z coordinate
    double z;

    int*p = nullptr;

    DPoint3d()
    {
        p = new int(5);
        std::cout << "DPoint3d" << endl;
    }
    DPoint3d(double _x, double _y, double _z)
    {
        p = new int(5);
        x = _x;
        y = _y;
        z = _z;
    }
    ~DPoint3d()
    {
        delete p;
        p = nullptr;

        std::cout << this << endl;

        std::cout << "~DPoint3d" << endl;
    }
    DPoint3d(const DPoint3d& pt)
    {
        std::cout << "123" << endl;
        x = pt.x;
        y = pt.y;
        z = pt.z;
    }

    DPoint3d(const DPoint3d&& pt)
    {
        std::cout << "456" << endl;
        x = pt.x;
        y = pt.y;
        z = pt.z;
    }

    DPoint3d& operator=(DPoint3d&& pt) {
        std::cout << "789" << endl;
        x = pt.x;
        y = pt.y;
        z = pt.z;
    }
};

DPoint3d fun()
{
    DPoint3d a; // 默认构造
    a.x = 1;
    a.y = 2;
    a.z = 3;
    // return a; // 报错:无法将左值绑定到右值引用
    //return std::move(a); // 返回右值引用,没有进行构造
    return a; // 返回右值引用,没有进行构造
}

DPoint3d&& fun1()
{
    return DPoint3d{1,2,3}; // 默认构造
}

int main()
{
        DPoint3d&& a = fun1();
        a.y = 20;
        std::cout << &a << endl;
        int i = 0;
        ++i;
}


输出:
0000008F6D7DDA08
~DPoint3d
0000008F6D7DDA08

有个假象,其实对象已经析构了。此时的DPoint3d&& a指向的是一个已经析构过的对象。

从输出结果来看,a和fun1里面的临时 对象的地址都是一样的。

0000008F6D7DDA08
0000008F6D7DDA08

 现出真容:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1933912.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【内网穿透】如何本地搭建Whisper语音识别模型并配置公网地址

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

数据库管理的艺术(MySQL):DDL、DML、DQL、DCL及TPL的实战应用(下:数据操作与查询)

文章目录 DML数据操作语言1、新增记录2、删除记录3、修改记录 DQL数据查询语言1、查询记录2、条件筛选3、排序4、函数5、分组条件6、嵌套7、模糊查询8、limit分页查询 集合操作union关键字和运算符in关键字any关键字some关键字all关键字 联合查询1、广义笛卡尔积2、等值连接3、…

【.NET全栈】ASP.NET开发Web应用——站点导航技术

文章目录 前言一、站点地图1、定义站点地图文件2、使用SiteMapPath控件3、SiteMap类4、URL地址映射 二、TreeView控件1、使用TreeView控件2、以编程的方式添加节点3、使用TreeView控件导航4、绑定到XML文件5、按需加载节点6、带复选框的TreeView控件 三、Menu控件1、使用Menu控…

【BUG】已解决:ModuleNotFoundError: No module named ‘cv2’

已解决&#xff1a;ModuleNotFoundError: No module named ‘cv2’ 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉城市开…

C语言中常见库函数(1)——字符函数和字符串函数

文章目录 前言1.字符分类函数2.字符转换函数3.strlen的使用和模拟实现4.strcpy的使用和模拟实现5.strcat的使用和模拟实现6.strncmp的使用和模拟实现7.strncpy函数的使用8.strncat函数的使用9.strncmp函数的使用10.strstr的使用和模拟实现11.strtok函数的使用12.strerror函数的…

打破运维“冷门槛“|暴雨液冷数据中心方案再升级

如果将数据比喻为驱动世界运转的新引擎&#xff0c;那数据中心便是为引擎提供源源不断动力的泵站。但随着泵站功率的日益增强&#xff0c;热浪成了不可避免的副产品。如何将数据热能转化为科技动能&#xff0c;是人工智能可持续发展的重要前提。 液冷技术&#xff0c;不仅可实现…

mysql命令练习

创建数据表grade: CREATE TABLE grade( id INT NOT NULL&#xff0c; sex CHAR(1)&#xff0c; firstname VARCHAR(20) NOT NULL&#xff0c; lastname VARCHAR(20) NOT NULL&#xff0c; english FLOAT&#xff0c; math FLOAT, chinese FLOAT )&#xff1b; 向数据表grade中插…

uniapp打包h5,白屏并报错Failed to load resource: net::ERR_FILE_NOT_FOUND

在manifest.json内找到web配置修改运行的基础路径

MySQL 进阶(三)【SQL 优化】

1、SQL 优化 1.1、插入数据优化 1.1.1、Insert 优化 1、批量插入 插入多条数据时&#xff0c;不建议使用单条的插入语句&#xff0c;而是下面的批量插入&#xff1a; INSERT INTO tb_name VALUES (),(),(),...; 批量插入建议一次批量 500~100 条&#xff0c;如果数据量比…

Web3时代的教育技术革新:智能合约在学习管理中的应用

随着区块链技术的发展和普及&#xff0c;Web3时代正在为教育技术带来前所未有的革新和机遇。智能合约作为区块链技术的核心应用之一&#xff0c;不仅在金融和供应链管理等领域展示了其巨大的潜力&#xff0c;也在教育领域中逐渐探索和应用。本文将探讨智能合约在学习管理中的具…

Linux中运用xsync实现免密集群分发

一、前言 今天搭建了三台虚拟机的集群&#xff0c;在集群中部分操作在三台虚拟机上的操作都一致&#xff0c;为了提高效率&#xff0c;就需要配置xsync实现集群分发。 二、设置免密登录 1.生成公钥和私钥 ssh-keygen -t rsa一直敲回车&#xff0c;会生成两个文件&#xff0c…

Yolov8网络结构学习

详解YOLOv8网络结构/环境搭建/数据集获取/训练/推理/验证/导出/部署 深入解析YOLOv8&#xff1a;网络结构与推理过程 YOLO? You Know! --YOLOV8详解 一&#xff1a;yolov8总体结构 1.Backbone:它采用了一系列卷积和 反卷积层只来提取特征&#xff0c;同时也使用了残差连接和…

酷炫末世意境背景404单页HTML源码

源码介绍 酷炫末世意境背景404单页HTML源码&#xff0c;背景充满着破坏一切的意境&#xff0c;彷佛末世的到来&#xff0c;可以做网站错误页或者丢失页面&#xff0c;将下面的代码放到空白的HTML里面&#xff0c;然后上传到服务器里面&#xff0c;设置好重定向即可 效果预览 …

滑动窗口题目

题目描述&#xff1a; 计算两个字符串str1和str2在给定的含有n个元素的字符串数组strs中出现的最短距离。 详细解释&#xff1a; 定义整数变量n&#xff0c;用于存储字符串数组strs的长度。定义一个vector<string>类型的变量strs&#xff0c;用于存储输入的字符串。定义…

Kafka消息队列python开发环境搭建

目录 引言 Kafka 的核心概念和组件 Kafka 的主要特性 使用场景 申请云服务器 安装docker及docker-compose VSCODE配置 开发环境搭建 搭建Kafka的python编程环境 Kafka的python编程示例 引言 Apache Kafka 是一个分布式流处理平台&#xff0c;由 LinkedIn 开发并在 2…

Linux--网络基础

计算机网络背景 计算机网络背景是一个复杂而丰富的领域&#xff0c;涵盖了从计算机单机模式到网络互联的演变过程&#xff0c;以及网络技术的不断发展和创新。 计算机单机模式和独立发展 在早期&#xff0c;计算机主要以单机模式存在&#xff0c;即每台计算机都是独立的&…

Jupyter Notebook安装及基本使用

Jupyter Notebook安装及基本使用 目录 Jupyter Notebook安装及基本使用方式一&#xff1a;Anaconda直接安装方式二&#xff1a;pip命令安装Jupyter使用虚拟环境 方式一&#xff1a;Anaconda直接安装 安装Anaconda 下载地址&#xff0c;输入邮箱&#xff0c;Windows下载 开始安…

探索Puppeteer的强大功能:抓取隐藏内容

背景/引言 在现代网页设计中&#xff0c;动态内容和隐藏元素的使用越来越普遍&#xff0c;这些内容往往只有在特定的用户交互或条件下才会显示出来。为了有效地获取这些隐藏内容&#xff0c;传统的静态爬虫技术往往力不从心。Puppeteer&#xff0c;作为一个强大的无头浏览器工…

成都亚恒丰创教育科技有限公司 【插画猴子:笔尖下的灵动世界】

在浩瀚的艺术海洋中&#xff0c;每一种创作形式都是人类情感与想象力的独特表达。而插画&#xff0c;作为这一广阔领域中的璀璨明珠&#xff0c;以其独特的视觉语言和丰富的叙事能力&#xff0c;构建了一个又一个令人遐想连篇的梦幻空间。成都亚恒丰创教育科技有限公司 在众多插…

【深度学习】InternVL2-8B,图转文,docker部署

文章目录 基础fastapi服务请求fastapi接口 基础 https://huggingface.co/OpenGVLab/InternVL2-8B#%E7%AE%80%E4%BB%8B InternVL2-26B应该更好&#xff0c;但显存没那么大&#xff0c;只能跑InternVL2-8B了。 下载&#xff1a; cd /ssd/xiedong/InternVL2-26B git clone htt…