Как мне объявить функцию, тип возвращаемого значения которой выводится?

Учти это C ++ 1y код (Живой пример):

#include <iostream>

auto foo();

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

auto foo() {
return 1234;
}

Компилятор (GCC 4.8.1) щедро выдает эту ошибку:

main.cpp: в функции int main ():
main.cpp: 8: 18: ошибка: использование функции «auto foo ()» перед удержанием «auto»
станд :: соиЬ << Foo ();
                   ^

Как мне переслать-объявить foo() Вот? Или, может быть, более уместно, можно ли форвард-декларировать foo()?


Я также попытался скомпилировать код, где я пытался объявить foo() в .h файл, определенный foo() так же, как тот, что выше в .cpp файл, включенный .h в моем main.cpp файл, содержащий int main() и призыв к foo()и построил их.

Произошла такая же ошибка.

13

Решение

Согласно документу, это было предложено в N3638, это явно допустимо.

Соответствующий фрагмент:

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

Однако это продолжает говорить:

Если для определения типа выражения необходим тип сущности с неопределенным типом заполнителя, программа является некорректной. Но как только в функции замечен оператор возврата, тип возврата, выведенный из этого оператора, можно использовать в остальной части функции, в том числе в других операторах возврата.

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
}

Поэтому тот факт, что вы использовали его до его определения, приводит к ошибке.

17

Другие решения

Других решений пока нет …