Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用模板查找最大值 我是C++模板新手,从中学习。 第二章是从参数中求最大值的函数。请看下面的代码 #include <iostream> #define PRINT(x) std::cout<<#x<<":"<<x<<std::endl; template <typename T> inline T const& max(T const& a,T const& b) { return a>b?a:b; } int main(){ int a=4; PRINT(a); PRINT(&a); double b=3.1; PRINT(b); PRINT(&b); double const & c = ::max<double>(a,b); PRINT(c); PRINT(&c); return 0; } #包括 #定义打印(x)标准::cout_C++_Templates - Fatal编程技术网

使用模板查找最大值 我是C++模板新手,从中学习。 第二章是从参数中求最大值的函数。请看下面的代码 #include <iostream> #define PRINT(x) std::cout<<#x<<":"<<x<<std::endl; template <typename T> inline T const& max(T const& a,T const& b) { return a>b?a:b; } int main(){ int a=4; PRINT(a); PRINT(&a); double b=3.1; PRINT(b); PRINT(&b); double const & c = ::max<double>(a,b); PRINT(c); PRINT(&c); return 0; } #包括 #定义打印(x)标准::cout

使用模板查找最大值 我是C++模板新手,从中学习。 第二章是从参数中求最大值的函数。请看下面的代码 #include <iostream> #define PRINT(x) std::cout<<#x<<":"<<x<<std::endl; template <typename T> inline T const& max(T const& a,T const& b) { return a>b?a:b; } int main(){ int a=4; PRINT(a); PRINT(&a); double b=3.1; PRINT(b); PRINT(&b); double const & c = ::max<double>(a,b); PRINT(c); PRINT(&c); return 0; } #包括 #定义打印(x)标准::cout,c++,templates,C++,Templates,它怎么可能是相同的?使用max可以说模板类型T是double,这意味着它返回对double的引用。但是a是一个int,它被转换成double max返回的引用是对为存储a的转换值而创建的临时值的引用 它之所以能工作,是因为您引用了const,这会延长临时值的生命周期。因为 double const & c = 告诉编译器分配足够的内存以适应双常量&,然后通过分配max的值立即占用它。这是一个定义,而不是一个声明。您将a定义为int int a=4; 但从max函数返回的值为doub

它怎么可能是相同的?使用
max
可以说模板类型
T
double
,这意味着它返回对
double
的引用。但是
a
是一个
int
,它被转换成
double

max
返回的引用是对为存储
a
的转换值而创建的临时值的引用

它之所以能工作,是因为您引用了
const
,这会延长临时值的生命周期。

因为

 double const & c =

告诉编译器分配足够的内存以适应双常量&,然后通过分配max的值立即占用它。这是一个定义,而不是一个声明。

您将
a
定义为
int

int a=4;

但从
max
函数返回的值为
double
。它位于不同的地址,结果可能是潜在的意外行为。

这不是模板特有的,没有模板也会发生同样的情况

根本原因是C++引用不是智能指针。它们不会自动管理内存

具体来说,这里发生的是将
inta=4
传递到
max(双常量&a,双常量&b)
。由于存在类型不匹配,并且<代码> max 无论如何承诺不改变值(const引用),C++生成一个<强>临时< /强> double,值为<代码> 4 < /C>。这个临时变量一直存在到完整表达式的末尾,换句话说,直到该行末尾的分号为止

那太不幸了。该行是
双常量&c
的初始化。因此,c被初始化为对临时
4.0
的引用,在初始化之后,临时立即消失

你现在有一个前替身的参考。再也没有了。它渴望峡湾

特别是,尝试在下一行使用
c
是未定义的行为,任何事情都可能发生。正确的解决方法是让
max
返回一个
double
。这是另一个价值。由于
4.0>3.1
,您将返回值。引用
constdouble&c
现在绑定到另一个使用该值初始化的临时文件
4.0


规则:将临时变量绑定到
常量&
会将临时变量的生存期延长到该
常量&
的生存期,并且只会延长该特定引用的生存期。用第一个引用初始化第二个引用不像智能指针那样工作,也不会延长临时引用的生命周期。

我很确定不会发生这种情况。(很可能)没有分配,也没有分配。您还混合了类型
double const&
不是
double
,因此它不能保存
max
的值。它可以保存对max返回值的引用。转换是在将
a
作为参数传递时进行的,而不是在返回结果时进行的。“从max函数返回为
double
”您可能需要检查它是否返回为
双常量&
。这是至关重要的。问题不仅仅是意外的行为,而是未定义的行为。