c++中临时变量不能作为非const的引用参数的方法
发布时间 - 2026-01-10 22:23:32 点击率:次试看下面的代码:
#include <iostream>
using namespace std;
void f(int &a)
{
cout << "f(" << a << ") is being called" << endl;
}
void g(const int &a)
{
cout << "g(" << a << ") is being called" << endl;
}
int main()
{
int a = 3, b = 4;
f(a + b); //编译错误,把临时变量作为非const的引用参数传递了
g(a + b); //OK,把临时变量作为const&传递是允许的
}
上面的两个调用之前,a+b的值会存在一个临时变量中,当把这个临时变量传给f时,由于f的声明中,参数是int&,不是常量引用,所以产生以下编译错误:
const_ref.cpp: In function `int main()':
const_ref.cpp:14: error: invalid initialization of non-const reference of type '
int&' from a temporary of type 'int'
const_ref.cpp:4: error: in passing argument 1 of `void f(int&)' 而在g(a+b)中,由于g定义的参数是const int&,编译通过。 问题是为什么临时变量作为引用参数传递时,必须是常量引用呢?很多人对此的解释是临时变量是常量,不允许赋值,改动,所以当作为非常量引用传递时,编译器就会报错。这个解释在关于理解临时变量不能作为非const引用参数这个问题上是可以的,但不够准确。事实上,临时变量是可以被作为左值(LValue)并被赋值的,请看下面的代码:
#include <iostream>
using namespace std;
class CComplex {
friend CComplex operator+(const CComplex &cp1, const CComplex &cp2);
friend ostream& operator<<(ostream &os, const CComplex &cp);
private:
int x;
public:
CComplex(){}
CComplex(int x1) {
x = x1;
}
};
CComplex operator+(const CComplex &cp1, const CComplex &cp2)
{
CComplex cp3;
cp3.x = cp1.x + cp2.x;
return cp3;
} ostream& operator<<(ostream &os, const CComplex &cp)
{
os << cp.x;
return os;
}
int main()
{
CComplex a(2), b(3), c(4);
cout << (a + b) << endl;
cout << ((a + b) = c) << endl; //临时对象作为左值
return 0;
}
上面的程序编译通过,而且运行结果是:
5
4
临时变量确实被赋值,而且成功了。
所以,临时变量不能作为非const引用参数,不是因为他是常量,而是因为c++编译器的一个关于语义的限制。如果一个参数是以非const引用传入,c++编译器就有理由认为程序员会在函数中修改这个值,并且这个被修改的引用在函数返回后要发挥作用。但如果你把一个临时变量当作非const引用参数传进来,由于临时变量的特殊性,程序员并不能操作临时变量,而且临时变量随时可能被释放掉,所以,一般说来,修改一个临时变量是毫无意义的,据此,c++编译器加入了临时变量不能作为非const引用的这个语义限制,意在限制这个非常规用法的潜在错误。
还不明白?OK,我们说直白一点,如果你把临时变量作为非const引用参数传递,一方面,在函数申明中,使用非常量型的引用告诉编译器你需要得到函数对某个对象的修改结果,可是你自己又不给变量起名字,直接丢弃了函数的修改结果,编译器只能说:“大哥,你这是干啥呢,告诉我把结果给你,等我把结果给你了,你又直接给扔了,你这不是在玩我呢吗?”所以编译器一怒之下就不让过了。这下大家明白了吧?
以上这篇c++中临时变量不能作为非const的引用参数的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
# const
# 变量
# 引用
# C++中引用和const关键字介绍
# C++引用的使用与const修饰符
# 浅析C++的引用与const指针与各种传递方式
# C++ const引用、临时变量 引用参数详解
# c++ const引用与非const引用介绍
# C++关于const与引用的分析讲解
# 我把
# 给大家
# 你把
# 这是
# 为左
# 就会
# 是在
# 给你
# 过了
# 他是
# 就有
# 还不
# 很多人
# 而在
# 会在
# 这个问题
# 你自己
# 希望能
# 你了
# 问题是
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID
高性价比服务器租赁——企业级配置与24小时运维服务
如何制作一个表白网站视频,关于勇敢表白的小标题?
如何快速搭建高效香港服务器网站?
EditPlus中的正则表达式 实战(4)
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
Laravel如何与Pusher实现实时通信?(WebSocket示例)
高防服务器如何保障网站安全无虞?
详解阿里云nginx服务器多站点的配置
使用Dockerfile构建java web环境
C语言设计一个闪闪的圣诞树
Mybatis 中的insertOrUpdate操作
香港服务器网站卡顿?如何解决网络延迟与负载问题?
悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音
Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用
瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口
Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询
Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】
香港服务器如何优化才能显著提升网站加载速度?
如何在万网开始建站?分步指南解析
如何在搬瓦工VPS快速搭建网站?
今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
Android自定义listview布局实现上拉加载下拉刷新功能
如何用好域名打造高点击率的自主建站?
Laravel如何使用Telescope进行调试?(安装和使用教程)
简历在线制作网站免费版,如何创建个人简历?
历史网站制作软件,华为如何找回被删除的网站?
Laravel如何使用Service Container和依赖注入?(代码示例)
Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】
ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】
详解jQuery中的事件
用v-html解决Vue.js渲染中html标签不被解析的问题
html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】
HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】
如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环
如何用虚拟主机快速搭建网站?详细步骤解析
Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境
Python数据仓库与ETL构建实战_Airflow调度流程详解
教学论文网站制作软件有哪些,写论文用什么软件
?
微信小程序制作网站有哪些,微信小程序需要做网站吗?
香港服务器建站指南:免备案优势与SEO优化技巧全解析
LinuxCD持续部署教程_自动发布与回滚机制
jQuery 常见小例汇总
html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】
三星、SK海力士获美批准:可向中国出口芯片制造设备
高防服务器租用指南:配置选择与快速部署攻略
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
QQ浏览器网页版登录入口 个人中心在线进入
详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点

