Use of 'auto func(int)' before deduction of 'auto' in C++14

19,206

Solution 1

This is [dcl.spec.auto/11]:

If the type of an entity with an undeduced placeholder type is needed to determine the type of an expression, the program is ill-formed. Once a non-discarded return statement has been seen in a function, however, the return type deduced from that statement can be used in the rest of the function, including in other return statements. [ Example:

auto n = n;                     // error, n's type is unknown
auto f();
void g() { &f; }                // error, f's return type is unknown
auto sum(int i) {
  if (i == 1)
    return i;                   // sum's return type is int
  else
    return sum(i-1)+i;          // OK, sum's return type has been deduced
}

 — end example ]

To translate this into English: the compiler needs to know the return type before you can use the function. In case of auto used like this, this is typically achieved by moving the definition before the point of use. If you don't actually need to use return type deduction, you can keep the definition after the use if you provide a signature, including the return type, in the declaration.

Solution 2

Clang has a much better error message for that one:

main.cpp:8:16: error: function 'func' with deduced return type cannot be used before it is defined
    auto ret = func(5);
               ^

I guess that's self-explanatory.

Solution 3

When auto is used as the return type in a function declaration that does not use the trailing return type syntax, the keyword auto indicates that the return type will be deduced from the operand of its return statement. That means the deduction can't be performed until the definition of the function func(), but before that it has been used in main().

You could move the definition before main(), or use trailing return type syntax to specify the return type on the declaration.

Share:
19,206
msc
Author by

msc

Hey, I am Mahendra. I am passionate about programming. I am working in C, C++ and embedded. Thank you.

Updated on June 11, 2022

Comments

  • msc
    msc about 2 years

    I have compiled following program in GCC using C++14.

    #include <iostream>
    using namespace std;
    
    auto func(int i);
    
    int main() 
    {
        auto ret = func(5);
        return 0;
    }
    
    auto func(int i) 
    {
      if (i == 1)
        return i;              
      else
        return func(i-1) + i;  
    }
    

    But, I get the following error.

    In function 'int main()': 8:16: error: use of 'auto func(int)' before
    deduction of 'auto'
     auto ret = func(5);
    

    So, what am I missing here?

  • Bartek Banachewicz
    Bartek Banachewicz about 7 years
    And as a side note, I suppose that's where the H-M inference comes in to actually be able to skip that, get the definition, and then check the thing properly.
  • StoryTeller - Unslander Monica
    StoryTeller - Unslander Monica about 7 years
    Gotta love them standard quotes.
  • vsoftco
    vsoftco about 7 years
    Straight to the point, great answer! I think it's also worth mentioning that even if in this case it looks like the compiler should be able to magically infer the return type even if f is defined after main, the problem really appears when the definition of f is in a separate translation unit: in that case, it's way too hard for the compiler to figure out what's going on.
  • user3496846
    user3496846 about 7 years
    Gotta love them clang quotes.