对于以下功能:
auto foo(auto A) {
int a = 9 + A;
return A;
}
A被推断出来的是什么?它是否依赖于调用者,或者由于整数加法可以推导为整数?例如,通话foo(1.5f)
会将A推导为float
?
答案 0 :(得分:1)
例如,调用foo(1.5f)会推导A浮动?
是的,但您用于定义函数的语法是GCC扩展名。
考虑使用:
template<typename T>
auto foo(T A)
{
int a = 9 + A;
return A;
}
或者如果你想要一个lambda函数:
auto foo = [](auto A)
{
int a = 9 + A;
return A;
}
在这两种情况下,如果使用float
类型的参数调用它,则foo的返回类型将推导为float
。如果您希望返回类型为int
,则应返回a
或将A
转换为int
。
当您使用auto
作为函数的返回类型时,返回类型将推导为第一个返回表达式的类型,如果有不同的返回路径,则必须返回相同的类型。例如:
if (1 == 1)
return (float)a;
else
return (int)b; // Error because the return type has already been deduced to float.
答案 1 :(得分:0)
据我所知,这是一个扩展。它将推导出与模板参数相同的内容。想一想:
template<typename T> // more verbose equivalent of your code
auto foo(T a) {
int a2 = 9 + a;
return a;
}
// ...
foo(1.f); // T is float
foo(std::valarray<int>{1, 5, 8}); // T is std::valarray<int>
返回类型将被推断为return语句中使用的表达式的类型。