gpt4 book ai didi

c++ - 通过引用调用模板特化

转载 作者:行者123 更新时间:2023-11-30 01:39:26 24 4
gpt4 key购买 nike

为了进一步了解 C++ 模板,我正在阅读一本书(C++ 模板:编译指南),但无法理解其中的解释。

// 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
}

书上说,

"问题是,如果您为三个 C 字符串调用 max(),语句

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

成为一个错误。这是因为对于 C 字符串,max(a,b) 创建一个新的临时本地值,该值可能由函数通过引用返回。
"

我知道 max(s1, s2, s3) 是通过引用参数调用的,但是在 max-of-three 函数中,max(a,b) 使用的是按值调用函数(因为它更专业) .并且临时返回值 max(a,b) 是一个值(在堆栈中)并且没有 max(value, reference) 函数。这不是问题所在吗?我无法理解书中的文字,说 ... 变成了错误。这是因为对于 C 字符串,max(a,b) 创建一个新的临时本地值,该值可能由函数通过引用返回

最佳答案

and the temporary return value max(a,b) is a value(in stack)

不,返回值不在“堆栈中”。这是一个值(value),时期。句号:

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

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

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

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

此临时值超出范围并在此函数调用返回时被销毁。它会这样做,并返回对已销毁值的引用。取消引用此引用成为未定义的行为。

这与模板和特化无关。对于等效的非模板代码也是如此。

关于c++ - 通过引用调用模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45787824/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com