一个通过引用返回局部变量的列子

本文探讨了一个C++新手常遇到的问题:使用模板函数处理不同类型的比较时可能出现的隐患。特别是当函数试图返回两种不同类型的较大值,并且这些类型之间不能直接相互转换时,可能会导致类型转换错误和临时变量引用问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我是一个C/C++的新手,因此看见这个问题的时候觉得很悬乎。总觉得这个问题藏得很深,需要记下来以便回忆。

ContractedBlock.gifExpandedBlockStart.gifCode
 1 #include <iostream>
 2 
 3 template<typename T1, typename T2>
 4 inline T1 const& max(T1 const& a, T2 const& b)
 5 {
 6     return a<b?b:a;
 7 }
 8 
 9 int main()
10 {
11     int a = 42;
12     double b = 66.66;
13     std::cout<<"max(a,b) : "<<::max(a,b)<<std::endl;
14     
15     return 0;
16 }
17 


上面的函数调用是存在问题的。因为当把b设置为double型的时候,如果b>a,那么将返回b。问题是,我们返回的要求是第一个模板参数类型,在这里就是int。
而b本身是一个double型的。这就出现了两个问题:
1:需要进行类型转换,即将b转化为int类型。这就使得返回的结果不是我们想要的结果了。(实际上在这里我们并不能保证它能正常的返回结果)。
2:由于需要进行类型转化,这里将会产生临时变量。但是,这个时候就要注意我们的返回值是一个引用。即,返回的是产生的临时变量的引用。这在函数调用中是很危险的。
   因为临时变量在函数的结束后其生命周期也就结束了。所以当我们在函数外面使用这个返回值的时候也就不知道它是什么内容了。虽然在很多情况下它都能正常的运行,
   但是在资源有限的情况下这将是一个致命的BUG。

记下,以备后用。

转载于:https://www.cnblogs.com/zhaoxb1982/archive/2009/07/29/1533836.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值