我是一个C/C++的新手,因此看见这个问题的时候觉得很悬乎。总觉得这个问题藏得很深,需要记下来以便回忆。
![](https://i-blog.csdnimg.cn/blog_migrate/34031c708bfe702fe82d01ff5c6593aa.gif)
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。
记下,以备后用。