繁体   English   中英

C ++模板:-警告功能模板

[英]C++ Templates:-Warning in a function template

以下功能模板尝试从输入的值中计算出最大值。 当我将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 ,程序将平稳运行。 为什么会这样呢?

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为max,则将其强制转换为T

如果T是一个int且U是一个double,则当U是最大值时,您将尝试返回double引用作为int引用。 您无法执行此操作,因此编译器将首先执行从double到int的类型转换,从而生成一个临时变量,然后将其作为引用返回,该引用将在函数返回后立即超出范围。

如果将其更改为返回T而不是T&,则它将正常工作。

通过工作,我的意思是它不会给您有关临时变量的警告。 但是我也怀疑它会不会达到您的期望。

如果双精度数是最大值并且以整数形式返回,那么您将不会取回与您输入的值相同的值。相反,您将获得一个整数,该整数表示双精度数的舍入值。 在您的示例中,它将输出20而不是20.10。

您确实需要使用宏来完成您在示例中想要执行的操作。

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

您实际上可能想要这样的东西:

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,甚至用于运行时变量。 希望有人能解释这个魔术吗?

编辑2:

对不起这是我的错。 请参阅下面@Sebastian Redl的评论以获取解释。

警告“返回对临时变量的引用”是指您对临时变量(函数内部的一个变量,当函数终止时将超出范围)返回一个引用。

为什么返回一个const引用?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM