模板专业化通过引用调用

时间:2017-08-20 23:55:59

标签: c++ templates

要了解有关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

1 个答案:

答案 0 :(得分:4)

  

并且临时返回值max(a,b)是一个值(堆栈中)

不,返回值不是“堆栈”。这是一个价值期。句号:

inline char const* max (char const* a, char const* b)

返回一个值。在调用者的上下文中,它是一个临时值。现在,让我们继续下一步:

return max (max(a,b), c); //

在此模板中,此return会返回引用。 refence是对此max()调用返回的值,在此上下文中,它是一个临时值。

此临时值超出范围,并在此函数调用返回时被销毁。它做了什么,并返回对被破坏的值的引用。取消引用此引用将成为未定义的行为。

这与模板和专业化无关。使用等效的非模板代码也是如此。