2013-06-24 8 views
12

Betrachten Sie diese C++ 1J Code (LIVE EXAMPLE):Wie deklariere ich eine Funktion, deren Rückgabetyp abgeleitet wird?

#include <iostream> 

auto foo(); 

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

auto foo() { 
    return 1234; 
} 

Der Compiler (GCC 4.8.1) großzügig diesen Fehler schießt aus:

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

Wie leite ich deklarations foo() hier? Oder vielleicht passender, ist es möglich, foo() vorwärts zu deklarieren?


Ich habe auch versucht, Code kompiliert, wo ich versuchte foo() in der .h Datei zu deklarieren, definierten foo() genau wie die oben in einer .cpp Datei auf, die die .h in meiner main.cpp Datei int main() und den Anruf enthält, zu foo(), und baute sie.

Derselbe Fehler ist aufgetreten.

+0

Sind Sie sicher, dass Sie das wirklich brauchen? Ich denke nicht, dass es generell eine gute Idee ist, Funktionen zu erstellen, die etwas so undefinierbares zurückgeben, vielleicht müssen Sie eine Instanz einer abstrakten High-Level-Klasse zurückgeben? Nichts für ungut wenn du weißt was du machst :) – SpongeBobFan

Antwort

17

Nach dem Papier wurde vorgeschlagen, in N3638, es ist ausdrücklich gültig, dies zu tun.

Relevante Schnipsel:

[ Example: 

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 
— end example ] 

Doch es weiter sagt:

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.

[ 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] 

So ist die Tatsache, dass man es verwendet, bevor sie definiert wurde bewirkt, dass es auf Fehler.