要了解有关C ++模板的更多信息,我正在阅读一本书(C ++模板:complate指南)并且无法理解解释。
// basics/max3a.cpp
#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
}
这本书说,
&#34; 问题是如果你为三个C字符串调用max(),那么语句
return max (max(a,b), c);
变成了错误。这是因为对于C字符串,max(a,b)创建一个新的临时本地值,该值可由函数通过引用返回。
&#34;
我理解max(s1,s2,s3)是通过引用参数调用的,但是在max-of-3函数中,max(a,b)使用了按值调用的函数(因为它&#39;更加专注)。临时返回值max(a,b)是一个值(堆栈中),没有max(value,reference)函数。这不是问题吗?我无法理解本书的文字... becomes an error. This is because for C-strings, max(a,b) creates a new, temporary local value that may be returned by the function by reference
。
答案 0 :(得分:4)
并且临时返回值max(a,b)是一个值(堆栈中)
不,返回值不是“堆栈”。这是一个价值期。句号:
inline char const* max (char const* a, char const* b)
返回一个值。在调用者的上下文中,它是一个临时值。现在,让我们继续下一步:
return max (max(a,b), c); //
在此模板中,此return
会返回引用。 refence是对此max()
调用返回的值,在此上下文中,它是一个临时值。
此临时值超出范围,并在此函数调用返回时被销毁。它做了什么,并返回对被破坏的值的引用。取消引用此引用将成为未定义的行为。
这与模板和专业化无关。使用等效的非模板代码也是如此。