读书人

C++ templates一书中2.4节basics/max3

发布时间: 2012-03-19 22:03:04 作者: rapoo

C++ templates一书中2.4节basics/max3a.cpp这个例子是不是有问题啊?
根据作者的原意,该段程序将会出错,原因是对于C-string, max(a, b)创建了一个临时的本地变量通过引用返回,在linux上测试,比较三个字符串的调用没有出错,反倒是比较三个整数的函数报错,望各位指教,谢谢。
#include <iostream>
#include <cstring>
#include <string>

// maximum of two values of any type (call-by-reference)
template <typename T>
inline T const& max (T const& a, T const& b)
{
return a < b ? b : a;
}

// maximum of two C-strings (call-by-value)
inline char const* max (char const* a, char const* b)
{
return std::strcmp(a,b) < 0 ? b : a;
}

// maximum of three values of any type (call-by-reference)
template <typename T>
inline T const& max (T const& a, T const& b, T const& c)
{
return max (max(a,b), c); // error, if max(a,b) uses call-by-value
}

int main ()
{
::max(7, 42, 68); // OK

const char* s1 = "frederic ";
const char* s2 = "anica ";
const char* s3 = "lucas ";
::max(s1, s2, s3); // ERROR

}

[解决办法]
你怎么看的结果,你是由参数传递指针进去的,但你并没有更改比较后的指针
inline char const* max (char * &a, char *&b)这样声明还差不多
在函数内交换或者不交换ab才能正确结果
[解决办法]
编译器给的warning也够清楚了:
21 D:\test\1.cpp [Warning] returning reference to temporary

读书人网 >C++

热点推荐