C ++模板: - 在函数模板中进行警告

时间:2013-08-14 14:57:56

标签: c++ templates

以下功能模板尝试计算输入值中的最大值。当我使用单一数据类型时,FT工作正常,但当与两种不同的数据类型一起使用时会显示警告。

功能如下:

template<typename T,typename U>
const T& maxVal(const T& var1,const U& var2)
{
if(var1<var2)
    return var1;
else
    return var2;
}

,用户功能(main)如下: -

int main(void)
{
  int var1 = 10;
  double var2 = 20.10;
  cout<<maxVal(10,20.10)<<endl;   // warning displayed " returning reference to temporary"
   cout<<maxVal(var1,var2)<<endl; // warning still persists in this case
  return 0;
}

当我删除U数据类型并将其替换为T时,程序会顺利运行。为什么会这样?

4 个答案:

答案 0 :(得分:1)

template<typename T>
const T& maxVal(const T& var1,const T& var2)

如果您使用maxVal(10,20.10),则会将其隐式地投放到另一个。这里double被转换为int

template<typename T,typename U>
const T& maxVal(const T& var1,const U& var2)

通过此实施,您始终返回T,因此如果var2为最大值,则会将其投放到T

答案 1 :(得分:1)

如果T是int且U是double,那么当U是最大值时,您将尝试将double引用作为int引用返回。你不能这样做,所以编译器将首先执行从double到int的类型转换,从而产生一个临时变量,然后它作为引用返回,一旦函数返回就会立即超出范围。

如果您将其更改为返回T而不是T&amp;它应该工作。

通过工作,我的意思是它不会给你一个关于临时变量的警告。但我怀疑它会做你期望的事情。

如果你的double是最大值并且作为int返回,那么你不会得到你输入的相同值。相反,你将获得一个表示double的舍入值的int。在您的示例中,它将输出20而不是20.10。

您真的需要使用宏来执行您在示例中想要执行的操作。

#define maxValue(a1,a2) \
   (a1 < a2 ? a2 : a1)

答案 2 :(得分:0)

你可能真的想要这样的东西:

template<typename T, typename U>
auto maxVal(const T& var1, const U& var2) -> decltype(var1<var2?var2:var1)
{
    return var1<var2 ? var2:var1;
}

但是,在编译时不能扣除运行时变量。像这样的代码只能在编译时工作,因为它的返回类型必须在编译时确保。

修改

令我惊讶的是,这段代码实际上适用于GCC 4.8甚至用于运行时变量。希望有人能解释这个魔法吗?

<强> EDIT2:

对不起,我的不好。请参阅@Sebastian Redl下面的评论以获得解释。

答案 3 :(得分:-1)

警告“返回对临时的引用”是指返回对临时变量的引用(函数内部的一个,当函数终止时,它会从范围中消失)。

为什么要返回const引用?

template<typename T,typename U>
const T maxVal(const T& var1,const U& var2)
{
if(var1<var2)
    return var1;
else
    return var2;
}