2017-04-18 75 views
1

我是新来的C++模板和从C++ Templates The Complete Guide学习。 第二章有函数从参数中找到最大值。请看下面的代码。使用模板查找最大值

#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; 
} 

输出。

一:4 &一个:0x7ffe1522731c

B:3.1 & B:0x7ffe15227320

C:4 & C:0x7ffe15227328

我不明白,为什么地址&a&c不一样吗?

回答

0

这是不特定模板,同样的情况没有他们。

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

具体来说,这里所发生的是,你传递给int a=4max<double>(double const& a, double const& b)。由于存在类型不匹配,并且max承诺无论如何都不会更改这些值(const引用),所以C++会生成一个临时值 double,值为4.0。这个临时生命到结尾的完整表达式,换句话说,直到该行末尾的分号。

这很不幸。该行是double const& c的初始化。因此,c被初始化为对临时4.0的引用,并且在初始化之后临时消失立即

您现在可以参考前双。没有更多。它正在寻找峡湾。

特别是,在下一行尝试使用c是未定义行为,并且可能发生任何事情。正确的解决办法是让max<double>返回double。这是另一个价值。并且由于4.0 > 3.1,您将收回4.0。现在,参考const double& c会绑定到使用该值4.0初始化的另一个临时值。

规则:结合一个临时到const&临时的寿命延伸到该const&寿命和仅该特定参考。用第一个引用初始化第二个引用不会像智能指针那样工作,并且不会延长临时的生命周期。

1

如何可能这是一样的吗?随着max<double>你说的那个模板类型Tdouble,这意味着它返回到double参考。但是aint,它被转换为double

max<double>返回的引用是对创建的临时值的引用,用于存储转换后的值a

,必须在所有的工作,因为你必须const,延长临时值的寿命引用。

-1

由于

double const & c = 

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

+0

我很确定这不会发生什么。有(最喜欢)没有分配,也没有分配。你也是混合类型'double const&'不是'double',所以它不能保存'max'的值。它可以保存对max返回的值的引用。转换发生在传递'a'作为参数时,而不是返回结果。 – luk32

+1

哎呀,你是对的。我错过了a是一个整数! –

0

你有a定义为int

int a=4; 

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

+0

“从最大函数返回为”double“。”你可能想要检查它,它返回为'double const&'。这是至关重要的。问题不仅仅是意外行为,而是未定义行为。 – MSalters