Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I declare a function whose return type is deduced?

Tags:

c++

c++14

auto

Consider this C++1y code (LIVE EXAMPLE):

#include <iostream>

auto foo();

int main() {
    std::cout << foo();   // ERROR!
}

auto foo() {
    return 1234;
}

The compiler (GCC 4.8.1) generously shoots out this error:

main.cpp: In function ‘int main()’:
main.cpp:8:18: error: use of ‘auto foo()’ before deduction of ‘auto’
std::cout << foo();
                   ^

How do I forward-declare foo() here? Or maybe more appropriately, is it possible to forward-declare foo()?


I've also tried compiling code where I tried to declare foo() in the .h file, defined foo() just like the one above in a .cpp file, included the .h in my main.cpp file containing int main() and the call to foo(), and built them.

The same error occurred.

like image 823
Mark Garcia Avatar asked Jun 24 '13 06:06

Mark Garcia


1 Answers

According to the paper it was proposed in, N3638, it is explicitly valid to do so.

Relevant snippet:

auto x = 5;                // OK: x has type int
const auto *v = &x, u = 6; // OK: v has type const int*, u has type const int
static auto y = 0.0;       // OK: y has type double
auto int r;                // error: auto is not a storage-class-specifier
auto f() -> int;           // OK: f returns int
auto g() { return 0.0; }   // OK: g returns double
auto h();                  // OK, h's return type will be deduced when it is defined

However it goes on to say:

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. But once a return statement has been seen in a function, the return type deduced from that statement can be used in the rest of the function, including in other return statements.

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
}

So the fact that you used it before it was defined causes it to error.

like image 181
Rapptz Avatar answered Oct 13 '22 10:10

Rapptz