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

苏州沧浪区做网站企业所得税税率多少

苏州沧浪区做网站,企业所得税税率多少,请人做网站要注意什么,百度网站排名突然消失函数返回const引用,使用const修饰变量接收 1、背景 想获取红绿灯时长数组并添加新的值。有个函数是返回红绿灯时长数组的。函数返回类型为const引用,我使用无修饰的变量接收。但是感觉有些问题,并且之前看到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相关的知识点。

http://www.dtcms.com/wzjs/817701.html

相关文章:

  • 名校长工作室网站建设福田蒙派克价格及图片
  • c2c的网站名称和网址网页微信登录不了提示为了安全考虑
  • 怎样说服老板做网站3d房子模型设计软件
  • 江西威乐建设集团有限公司企业网站虚拟主机免费领取
  • 自己做的网站手机不能看微信小程序打不开什么原因
  • 尚品中国多年专注于高端网站建设无障碍环境建设 网站
  • 镇江市建设工程安全监督站网站wordpress仿微信订阅主题
  • 网站域名证书佛山建筑设计院有限公司官网
  • 可以接单做网站的软件开发网站能赚多少钱
  • 怎么查看网站空间wordpress 文章样式
  • 重庆商城网站建设地址百度集团网站建设方案
  • 免费模板建站网站校园旅游网站建设方案策划书
  • 提供免费服务器的网站会刊彩页设计
  • 网站在百度上搜索不到网站设置手机版
  • 网站开发外包报价单云南网站建设首选公司
  • 怎么做整人点不完的网站学校网站建设实训总结
  • 私人pk赛车网站怎么做oa办公平台
  • 成都个人网站建设网站开发 自学
  • 免费地方门户网站源码怎么用电脑做网站服务器吗
  • 网站建设与应用岗位阜阳城乡建设局网站
  • 做粉丝网站so导航 抖音
  • 镇江市住房城乡建设局网站网站建设公司咨询电话
  • 中山网站建设收费标准人力管理系统
  • 中国水电建设集团港航建设有限公司网站上海做无创DNA医院网站
  • 装修网站排名前十名广州天河
  • 东莞网站推广软件怎么在网站视频做字幕
  • wordpress文章自动分页长沙seo招聘
  • 响应式网站的服务兰州装修公司口碑排名推荐
  • 网站开发未来建设网站需要收费吗
  • wordpress网站使用教程微信小程序直播开通条件