当前位置: 首页 > news >正文

函数返回const引用,使用const修饰变量接收

函数返回const引用,使用const修饰变量接收

1、背景

想获取红绿灯时长数组并添加新的值。有个函数是返回红绿灯时长数组的。函数返回类型为const引用,我使用无修饰的变量接收。但是感觉有些问题,并且之前看到const变量变成非const还需要使用const_cast。

查了一下copilot,确实需要注意。

2、问题分析

GetPassTimeVec函数原型如下:

const std::vector<uint32_t>& CalLightLength::GetPassTimeVec()
{return m_passTime;
}

我在其他代码位置获取这个函数,并使用无修饰变量接收,写法如下

// CalLightLength calLightLength;  这个对象非单例类对象,是从前往后都存在的实例化对象,仅做演示。
std::vector<uint32_t> vec = calLightLength.GetPassTimeVec();

这个代码写出来感觉有点不对劲,因为没有做const_cast解除const。

问了下copilot,能否哟个无修饰变量接收函数const引用返回值。copilot回答如下:

函数返回const引用,用非const变量接收有问题吗

是的,用非 const 变量接收 const 引用的返回值可能会带来一些问题,主要体现在 编译错误潜在的未定义行为 这两方面。

1. 编译错误

如果函数返回的是 const 引用,而你尝试用 const 引用 const 变量 进行接收,编译器通常会报错。例如:

cpp

const int& getValue() {static int value = 42;return value;
}int& ref = getValue();  // ❌错误:不能用非 const 引用接收 const 引用返回值

这里 getValue() 返回 const int&,但 refint&,试图去掉 const 限制,违反了 const 保护规则,编译器会报错。

2. 未定义行为

如果使用 const 变量 接收 const 引用返回值,并进行 修改,可能会导致 未定义行为

cpp

const int& getValue() {static int value = 42;return value;
}int ref = getValue();  // ✅可以编译,但有潜在问题
ref = 100;  // ⚠️此时只是修改了 `ref`,不会影响 `value`

这里 ref按值接收(不是引用),因此 refgetValue() 返回值的 拷贝,修改 ref 并不会改变 value,但可能会让人误以为 value 被修改了。

3. 正确的做法

如果不希望修改返回值,应该使用 const 引用接收:

cpp

const int& ref = getValue();  // ✅正确
std::cout << ref << std::endl;

如果确实需要修改返回值,可以考虑 去掉 const 或使用 const_cast

cpp

int& ref = const_cast<int&>(getValue());  // ⚠️危险,可能导致未定义行为
ref = 100;  // 这里修改了 `value`

但请谨慎使用 const_cast,它会破坏 const 保护,可能导致不可预知的结果!

总结

  1. 不能用非 const 引用接收 const 引用返回值,否则编译会报错。
  2. 用非 const 变量接收 const 引用返回值,不会直接导致错误,但会创建一个 拷贝,修改时不会影响原值。
  3. 推荐用 const 引用接收 const 引用返回值,避免拷贝,提高性能,同时保证 const 语义。

针对回答中的如果使用非修饰的变量接收函数const引用返回值,可以编译,但有潜在问题。此时只是修改了 ref,不会影响value。下面验证一下,看看能不能复现问题。

下面是测试代码

std::vector<int> g_vec;void SetVec(std::vector<int> vec) {g_vec.assign(vec.begin(), vec.end());
}const std::vector<int> &GetVec() {return g_vec;
}int main() {std::vector<int> vec = {3, 2, 1, 5, 6, 7, 89};SetVec(vec);std::vector<int> vecCopy = GetVec();std::vector<int> vecAdd = {10, 11};vecCopy.insert(vecCopy.end(), vecAdd.begin(), vecAdd.end());for (int i = 0; i < g_vec.size(); i++) {printf("%d ", g_vec[i]);}return 0;
}
// 打印信息
// 3 2 1 5 6 7 89

和copilot的表示一样,不会对原来的g_vec有影响。那么copilot表述的可能有潜在风险应该指的是没有实现预期的功能。

如果改变GetVec函数的实现形式,可以实现改变g_vec的功能。代码如下:

修改点两处:

// 将返回值由const改成非const
std::vector<int> &GetVec() {return g_vec;
}// 用引用接收GetVec函数返回值
std::vector<int>& vecCopy = GetVec();// 打印信息
// 3 2 1 5 6 7 89 10 11

那么为什么不用const引用接收GetVec函数const引用返回值呢?因为在调用处需要更改g_vec内容,不能使用const,所以就需要更改GetVec函数定义形式。

以上就梳理一些const相关的知识点。

相关文章:

函数返回const引用,使用const修饰变量接收

函数返回const引用&#xff0c;使用const修饰变量接收 1、背景 想获取红绿灯时长数组并添加新的值。有个函数是返回红绿灯时长数组的。函数返回类型为const引用&#xff0c;我使用无修饰的变量接收。但是感觉有些问题&#xff0c;并且之前看到const变量变成非const还需要使用…...

在激烈竞争下B端HMI设计怎样打造独特用户体验?

在当今数字化高度发展的时代&#xff0c;B 端市场竞争愈发激烈。对于 B 端 HMI&#xff08;人机界面&#xff09;设计而言&#xff0c;打造独特的用户体验已成为在竞争中脱颖而出的关键因素。B 端用户在复杂的工作场景中&#xff0c;对 HMI 设计有着独特的需求和期望&#xff0…...

数理逻辑(Mathematical Logic)综论与跨学科应用

李升伟 整理 数理逻辑&#xff08;Mathematical Logic&#xff09;是现代逻辑学与数学交叉的核心学科&#xff0c;以严格的数学方法研究逻辑推理的形式与规律。其发展深刻影响了数学基础、计算机科学、语言哲学等领域。以下从多个维度综论数理逻辑&#xff1a; 1. 核心分支 命…...

4.17---实现商铺和缓存与数据库双写一致以及宕机处理

实现商铺和缓存与数据库双写一致&#xff08;以及强双写一致策略&#xff09; redis点评项目采用的是延时双删策略 双删&#xff1a; 我们更新完数据库之后删除缓存&#xff0c;这样即使有线程并发进来查询&#xff0c;会发现缓存中没有数据&#xff0c;从而会去mysql中查找…...

qt与html通信

**Cef视图&#xff08;CefView&#xff09;**是指在使用Chromium Embedded Framework&#xff08;CEF&#xff09;时&#xff0c;嵌入到应用程序中的浏览器视图。CEF是一个开源项目&#xff0c;它基于Google的Chromium浏览器&#xff0c;允许开发者将Web浏览器功能嵌入到自己的…...

【从零实现高并发内存池】thread cache、central cache 和 page cache 回收策略详解

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…...

算法5-16 对二进制字符串解码

输入样例&#xff1a; 5 a 4 b 3 c 2 w 1 z 1 100001110101101101100111输出样例&#xff1a; baaacabwbzc ac代码&#xff1a; #include<iostream> #include<queue> #include<map> using namespace std; const int N10010; int idx; int a[N][2]; char b…...

[MySQL数据库] InnoDB存储引擎(三): 内存结构详解

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…...

TDengine 存储引擎剖析:数据文件与索引设计(一)

TDengine 存储引擎简介 在物联网、工业互联网等快速发展的今天&#xff0c;时间序列数据呈爆发式增长。这些数据具有产生频率高、依赖采集时间、测点多信息量大等特点&#xff0c;对数据存储和处理提出了极高要求。TDengine 作为一款高性能、分布式、支持 SQL 的时序数据库&am…...

CentOS更换yum源

CentOS更换yum源 视频教程&#xff1a; https://www.bilibili.com/video/BV1yWaSepE6z/?spm_id_from333.1007.top_right_bar_window_history.content.click 步骤&#xff1a; 第一步&#xff1a; cd /etc/yum.repos.d第二步&#xff1a;cp CentOS-Base.repo CentOS-Base.repo…...

【Kubernetes基础--持久化存储原理】--查阅笔记5

目录 持久化存储机制PV 详解PV 关键配置参数PV 生命周期的各个阶段 PVC 详解PVC 关键配置参数PV 和 PVC 的生命周期 StorageClass 详解StorageClass 关键配置参数设置默认的 StorageClass 持久化存储机制 k8s 对于有状态的容器应用或对数据需要持久化的应用&#xff0c;不仅需…...

数据库子查询实验全解析

目录 一、验证性实验&#xff1a;夯实基础&#xff08;一&#xff09;查询同班学生信息&#xff08;二&#xff09;查询成绩相关信息&#xff08;三&#xff09;查询课程选课人数&#xff08;四&#xff09;相关子查询&#xff08;五&#xff09;EXISTS嵌套子查询&#xff08;六…...

HTML:表格数据展示区

<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>人员信息表</title><link rel"styl…...

webgl入门实例-08索引缓冲区的基本概念

WebGL 索引缓冲区 (Index Buffer) 索引缓冲区(也称为元素数组缓冲区)是WebGL中一种优化渲染性能的重要机制&#xff0c;它允许您重用顶点数据来绘制复杂的几何图形。 基本概念 索引缓冲区的工作原理&#xff1a; 您创建一个顶点缓冲区(包含所有顶点数据)然后创建一个索引缓…...

大数据应用开发——大数据平台集群部署

目录 前言 目录 基础环境 安装虚拟机 基础环境 VMware Workstation 虚拟机版本 &#xff1a; centos7 主机名 ip 用户名 密码 master192.168.245.100root123456slave1192.168.245.101root123456slave2192.168.245.102root123456 安装虚拟机 安装 名称、路径自己改 我有16核&…...

GPT对话UI--通义千问API

GPT对话UI 项目介绍 一个基于 GPT 的智能对话界面&#xff0c;提供简洁优雅的用户体验。本项目使用纯前端技术栈实现&#xff0c;无需后端服务器即可运行。 功能特点 &#x1f4ac; 实时对话&#xff1a;支持与 AI 进行实时对话交互&#x1f313; 主题切换&#xff1a;支持…...

智能体数据分析

数据概览&#xff1a; 展示智能体的累计对话次数、累计对话用户数、对话满意度、累计曝光次数。数据分析&#xff1a; 统计对话分析、流量分析、用户分析、行为分析数据指标&#xff0c;帮助开发者完成精准的全面分析。 ps&#xff1a;数据T1更新&#xff0c;当日12点更新前一天…...

泛型算法——只读算法(一)

在 C 标准库中&#xff0c;泛型算法的“只读算法”指那些 不会改变它们所操作的容器中的元素&#xff0c;仅用于访问或获取信息的算法&#xff0c;例如查找、计数、遍历等操作。 accumulate std::accumulate()是 C 标准库**numeric**头文件中提供的算法&#xff0c;用于对序列…...

树莓派超全系列教程文档--(29)config.txt介绍

config.txt介绍 什么是 config.txt &#xff1f;文件格式高级功能include条件过滤 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 什么是 config.txt &#xff1f; Raspberry Pi 设备使用名为 config.txt 的配置文件&#xff0c;而不是传统 PC …...

第十六届蓝桥杯大赛软件赛省赛 C++ 大学 B 组 部分题解

赛时参加的是Python组&#xff0c;这是赛后写的题解&#xff0c;还有两题暂时还不会&#xff0c;待更新 题目链接题目列表 - 洛谷 | 计算机科学教育新生态 A 移动距离 答案&#xff1a;1576 C 可分解的正整数 Python3 import itertools from functools import cmp_to_ke…...

C++栈与堆内存详解:Visual Studio实战指南

C++栈与堆内存详解:Visual Studio实战指南 IDE环境:Visual Studio 2022 一、内存分区与核心概念 在C++程序中,内存分为**栈(Stack)和堆(Heap)**两大核心区域,两者的管理方式、生命周期和适用场景差异显著。 1. 栈内存(Stack Memory) • 特性: • 自动管理:由编…...

在Ubuntu服务器上部署xinference

一、拉取镜像 docker pull xprobe/xinference:latest二、启动容器&#xff08;GPU&#xff09; docker run -d --name xinference -e XINFERENCE_MODEL_SRCmodelscope -p 9997:9997 --gpus all xprobe/xinference:latest xinference-local -H 0.0.0.0 # 启动一个新的Docker容…...

非洲电商争夺战:中国闪电战遭遇本土游击队的降维打击

2024年5月&#xff0c;南非电商市场爆发史诗级对决——Temu闪电突袭下载量破百万&#xff0c;却在30天内遭遇Takealot的本土化反击致留存率腰斩。这场价值500亿美元市场的攻防战&#xff0c;揭开了非洲电商最残酷的生存法则&#xff1a;低价利刃砍不动本土化铁壁。 一、跨境模式…...

亚瑟阿伦36问

问 36 个问题&#xff0c;你就能爱上一个人&#xff0c;对方也能爱上你。 第一组 聚焦个人背景与价值观 例如“你最感激生命中的什么&#xff1f;”、“如果可以改变成长经历&#xff0c;你会改变什么&#xff1f;” 1、如果可以跟世上任何人共进晚餐&#xff0c;你会选择谁&…...

Ubuntu 20.04.6编译安装COMFAST CF-AX90无线网卡驱动

目录 0 前言 1 CF-AX90无线网卡驱动 1.1 驱动下载 1.2 驱动准备 2 编译安装驱动 2.1 拷贝驱动依赖到系统 2.2 驱动安装编译 3 重启 0 前言 COMFAST CF-AX90或者说AIC8800D80的Linux版本驱动不支持高版本的linux内核&#xff0c;实测目前仅支持最高5.15的内核。Ubuntu2…...

函数的极限与连续(强化和真题)

强化错题如下&#xff1a;...

4.15【Q】netsafe

我正在学习网络空间安全&#xff0c;” Cookie&#xff1a;使用防hash技术防御SYN泛洪攻击&#xff0c;减少服务器内存消耗“什么意思&#xff1f;什么是SYN泛洪攻击&#xff1f;什么又是防hash技术防御&#xff1f; &#xff1f;详细解释&#xff0c;越细节越好 连接成功率 …...

多个路由器互通(静态路由)无单臂路由(简单版)

多个路由器互通&#xff08;静态路由&#xff09;无单臂路由&#xff08;简单版&#xff09; 开启端口并配ip地址 维护1 Router>en Router#conf t Router(config)#int g0/0 Router(config-if)#no shutdown Router(config-if)#ip address 192.168.10.254 255.255.255.0 Ro…...

opencv HSV的具体描述

色调H&#xff1a; 使用角度度量&#xff0c;取值范围为0\~360&#xff0c;从红色开始按逆时针方向计算&#xff0c;红色为0&#xff0c;绿色为120&#xff0c;蓝色为240。它们的补色是&#xff1a;黄色为60&#xff0c;青色为180&#xff0c;紫色为300。通过改变H的值&#x…...

ubuntu磁盘挂载

1、‌查看磁盘设备及分区‌ 命令‌&#xff1a;列出所有块设备&#xff08;磁盘及分区&#xff09; lsblk 0表示此块未挂载 2、格式化分区 sudo mkfs.ext4 /dev/sdb 注意sdb换成自己的块名称 3、创建挂载点目录‌ sudo mkdir -p /mnt/data4、永久挂载 sudo blkid /dev…...

Visual Studio C++引入第三方库

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文主要整理visual studio C导入第三方库的注意事项与操作 bilibili配套视频:【visual studio C导入第三方库-哔哩哔哩】 https://b23.tv/vphfXnv 运行库选项 右键项目 -> 属性 -> C/C ->代码生成->…...

2025中国移动云智算大会回顾:云智变革,AI+跃迁

4月10日&#xff0c;2025中国移动云智算大会在苏州举办。会上&#xff0c;中国移动开启“由云向智”新范式&#xff0c;以“智”为核心开辟算网新生态&#xff0c;彰显其在AI新时代的战略远见与技术引领力。 “云智算”将如何通过算网基础设施与人工智能核心技术的深度融合&am…...

海珠区公示人工智能大模型应用示范区第二批资金奖励企业名单,助力产业蓬勃发展

2025 年 4 月 15 日&#xff0c;广州琶洲人工智能与数字经济试验区管理委员会在广州市海珠区人民政府门户网站发布重要通知&#xff0c;对人工智能大模型应用示范区政策兑现工作&#xff08;第二批&#xff09;&#xff08;大模型专题&#xff09;资金奖励企业名单予以公示。这…...

golang处理时间的包time一次性全面了解

本文旨在对官方time包有个全面学习了解。不钻抠细节&#xff0c;但又有全面了解&#xff0c;重点介绍常用的内容&#xff0c;一些低频的可能这辈子可能都用不上。主打一个花最少时间办最大事。 Duration对象: 两个time实例经过的时间,以长度为int64的纳秒来计数。 常见的durati…...

文件的加密与解密学习笔记

一些可能想知道的&#xff1a; cryptography库&#xff1a;密码学工具包 Fernet 是crytography 里的一个模块&#xff0c;用于对称加密 with open() as file #为了保证无论是否出错都能正确地关闭文件&#xff0c;与try...finally...相同 open() #用于读文件&#xff08;默认…...

《TCP/IP网络编程》学习笔记 | Chapter 24:制作 HTTP 服务器端

《TCP/IP网络编程》学习笔记 | Chapter 24&#xff1a;制作 HTTP 服务器端 《TCP/IP网络编程》学习笔记 | Chapter 24&#xff1a;制作 HTTP 服务器端HTTP 概要理解 Web 服务器端无状态的 Stateless 协议请求消息&#xff08;Request Message&#xff09;的结构响应消息&#x…...

Apache POI(笔记)

介绍&#xff1a; 坐标&#xff1a; 写入Excel表格&#xff1a; 读取Excel表格&#xff1a;...

Table类型的表单

形如下面的图片 1 label与prop属性 const columns[{label: "文件名",prop: "fileName",scopedSlots: "fileName",},{ label: "删除时间",prop: "recoveryTime",width: "200",},{ label: "大小",prop:…...

Spring 中的验证、数据绑定和类型转换

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…...

【技术派后端篇】canal实现MySQL/Redis缓存一致性

1 前言 在探讨如何利用canal实现MySQL/Redis缓存一致性之前&#xff0c;强烈建议大家先阅读以下几篇相关文章&#xff0c;因为本文是基于这些文章的基础上展开的&#xff1a; 《深度剖析 MySQL 与 Redis 缓存一致性&#xff1a;理论、方案与实战》 &#xff1a;该文详细阐述了…...

华清远见STM32F103智能小车重磅上线!循迹避障红外遥控WiFi远程控制,0基础小白从入门到单片机软硬件项目实战!

STM32F103智能云控小车是由华清远见倾力打造的一款多功能智能小车&#xff0c;专为高校教学、学生毕业设计、创新竞赛、单片机入门学习及项目实践量身定制。这款小车集红外遥控、远程物联网控制、智能巡线、高精度避障和交互式显示屏五大核心功能于一体&#xff0c;融合了物联网…...

李飞飞团队新作WorldScore:“世界生成”能力迎来统一评测,3D/4D/视频模型同台PK

从古老神话中对世界起源的幻想&#xff0c;到如今科学家们在实验室里对虚拟世界的构建&#xff0c;人类探索世界生成奥秘的脚步从未停歇。如今&#xff0c;随着人工智能和计算机图形学的深度融合&#xff0c;我们已站在一个全新的起点&#xff0c;能够以前所未有的精度和效率去…...

seaborn库详解

Seaborn 是一个基于 Python 的统计数据可视化库&#xff0c;它建立在 matplotlib 之上&#xff0c;旨在提供更高级、更美观、更具统计意义的可视化功能。 CONTENT 1. 单变量分布可视化功能代码 2. 双变量联合分布可视化功能代码 3. 分类数据柱状图可视化功能代码 4. 箱线图可视…...

UNACMS PHP对象注入漏洞复现(CVE-2025-32101)(附脚本)

免责申明: 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 前言…...

应用篇02-镜头标定(上)

本节主要介绍相机的标定方法&#xff0c;包括其内、外参数的求解&#xff0c;以及如何使用HALCON标定助手实现标定。 计算机视觉——相机标定(Camera Calibration)_摄像机标定-CSDN博客 1. 原理 本节介绍与相机标定相关的理论知识&#xff0c;不一定全&#xff0c;可以参考相…...

游戏引擎学习第230天

回顾并为今天的内容定下基调 今天是我们进行“排序”工作的第二天。昨天我们在渲染器中实现了排序功能。这其实是从一开始就知道必须做的事情&#xff0c;只是一直没有合适的时机。而昨天终于迎来了这个时机&#xff0c;不知道为什么&#xff0c;可能就是突然有了冲动和想法&a…...

3.串口通信之SPI

—>1.串口通信之UART见这篇<— —>2.串口通信之IIC见这篇<— 1.SPI特点 SPI&#xff08;Serial Peripheral Interface)即串行外设接口&#xff0c;有4条总线&#xff0c;分别是SCLK(SPI Clock)&#xff0c;MISO(Master Input Slave Output)&#xff0c;MOSI(Mast…...

无人机姿态稳定与动态控制模块概述!

一、设计难点 1. 动态算力需求与硬件能力的不匹配** 无人机边缘计算设备通常受限于体积和重量&#xff0c;导致其计算单元&#xff08;如CPU、GPU&#xff09;的算力有限&#xff0c;难以应对突发的高负载任务&#xff08;如实时图像处理、AI推理&#xff09;。 挑战&am…...

【shell】终端文本的颜色和样式打印

在Shell脚本中&#xff0c;\033[XXm 是 ANSI转义序列&#xff0c;用于控制终端文本的颜色和样式。以下是完整的颜色和样式代码列表&#xff1a; 1. 基本格式 echo -e "\033[CODEm你的文本\033[0m"\033[&#xff1a;转义序列开始&#xff08;\e[ 或 \x1b[ 等效&#…...

模型加载常见问题

safetensors_rust.SafetensorError: Error while deserializing header: HeaderTooLarge 问题代码&#xff1a; model AutoModelForVision2Seq.from_pretrained( "/data-nvme/yang/Qwen2.5-VL-32B-Instruct", trust_remote_codeTrue, torch_dtypetorc…...