c ++自动参数的扣除规则

时间:2016-03-02 03:04:21

标签: c++ auto

对于以下功能:

auto foo(auto A) {
  int a = 9 + A;
  return A;
}

A被推断出来的是什么?它是否依赖于调用者,或者由于整数加法可以推导为整数?例如,通话foo(1.5f)会将A推导为float

2 个答案:

答案 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语句中使用的表达式的类型。