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;
}
用户功能(主要)如下:-
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
为最大值,则它将被广播到T
如果T是int,U是double,那么当U是最大值时,您将尝试返回一个double引用作为int引用。不能这样做,所以编译器将首先执行从double到int的类型转换,生成一个临时变量,然后将其作为引用返回,一旦函数返回,该引用就会立即超出作用域。
如果您将其更改为返回T而不是T&那么它应该起作用。
工作,我的意思是,它不会给你一个关于临时变量的警告。但我也怀疑它会达到你的预期。
如果你的double是最大值,并且返回为int,那么你不会得到与你输入的值相同的值。相反,你会得到一个int,代表你的doubles的四舍五入值。在您的示例中,它将输出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;
}
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 将重载的成员函数传递给函数模板
- C++17中函数模板中的静态数组初始化(MSVC 2019)
- 为什么 gcc 和 clang 为函数模板的实例化生成不同的符号名称?
- 具有常量引用参数的函数模板专用化
- std::span<const T> 作为函数模板中的参数
- 如何编写一个完美的缩写函数模板?
- 仅在函数模板中为那些定义了函数的类型执行函数
- 如何在C++中伪造虚拟可变参数函数模板?
- 以下代码中的函数模板有什么问题?
- 在 C++20 中是否不再允许在 std 中对程序定义类型的函数模板进行专用化?
- 将显式实例化的函数模板与转换匹配
- 使用定义函数模板别名
- 函数模板返回类型
- C++有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?
- C++ std::functional 中的可变参数函数模板
- 警告:忽略模板参数上的属性..在 std::unique_ptr (-wignore 属性)的声明中
- 单行函数模板 c++ 的内联性保证
- C++函数模板需要 &for 数组参数
- C++模板:-函数模板中的警告