试看下面的代码:
#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与引用的分析讲解
# 我把
# 给大家
# 你把
# 这是
# 为左
# 就会
# 是在
# 给你
# 过了
# 他是
# 就有
# 还不
# 很多人
# 而在
# 会在
# 这个问题
# 你自己
# 希望能
# 你了
# 问题是
相关文章:
如何快速搭建虚拟主机网站?新手必看指南
制作网站公司那家好,网络公司是做什么的?
如何快速打造个性化非模板自助建站?
上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?
成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?
如何通过主机屋免费建站教程十分钟搭建网站?
网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?
如何在腾讯云免费申请建站?
网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?
网站制作需要会哪些技术,建立一个网站要花费多少?
制作网站的公司有哪些,做一个公司网站要多少钱?
建站之星如何助力企业快速打造五合一网站?
微信小程序 五星评分(包括半颗星评分)实例代码
小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化
如何在建站主机中优化服务器配置?
深圳网站制作平台,深圳市做网站好的公司有哪些?
jQuery 常见小例汇总
如何通过多用户协作模板快速搭建高效企业网站?
c# F# 的 MailboxProcessor 和 C# 的 Actor 模型
免费ppt制作网站,有没有值得推荐的免费PPT网站?
盘锦网站制作公司,盘锦大洼有多少5G网站?
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
长沙做网站要多少钱,长沙国安网络怎么样?
高性能网站服务器配置指南:安全稳定与高效建站核心方案
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
临沂网站制作公司有哪些,临沂第四中学官网?
宝塔面板如何快速创建新站点?
网站制作话术技巧,网站推广做的好怎么话术?
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
三星网站视频制作教程下载,三星w23网页如何全屏?
,购物网站怎么盈利呢?
如何配置支付宝与微信支付功能?
昆明网站制作哪家好,昆明公租房申请网上登录入口?
如何选择美橙互联多站合一建站方案?
建站之星各版本价格是多少?
创业网站制作流程,创业网站可靠吗?
佛山网站制作系统,佛山企业变更地址网上办理步骤?
微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?
如何通过NAT技术实现内网高效建站?
魔方云NAT建站如何实现端口转发?
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
如何选择高效可靠的多用户建站源码资源?
如何通过虚拟机搭建网站?详细步骤解析
如何快速搭建高效可靠的建站解决方案?
郑州企业网站制作公司,郑州招聘网站有哪些?
如何在Golang中指定模块版本_使用go.mod控制版本号
,交易猫的商品怎么发布到网站上去?
如何在万网ECS上快速搭建专属网站?
已有域名建站全流程解析:网站搭建步骤与建站工具选择
*请认真填写需求信息,我们会在24小时内与您取得联系。