Wozu schreibt man vor einer Funktion welchen Datentyp es zurückgibt?
-
DarkShadow44 schrieb:
Mal ganz Angesehen von Sachen wie "return 0", was alles mögliche darstellen kann. Welchen Typ gibst du da zurück ?
Integer-Literale ohne Suffix sind doch standardmäßig ints.
-
DarkShadow44 schrieb:
Mal ganz Angesehen von Sachen wie "return 0", was alles mögliche darstellen kann. Welchen Typ gibst du da zurück?
0 ist vom Typ int. Und Compiler müssen eh schon wissen welchen Typ ein beliebiger Ausdruck hat, weil es decltype gibt.
auto func(){ return irgendwas; } //wird vom compiler umgeschrieben in decltype(irgendwas) func(){ return irgendwas; }Die Frage, warum man überhaupt Rückgabewerte an Funktionen ranschreiben muss ist überhaupt nicht trivial, denn in den meisten Fällen ist es nämlich unnötig redundant.
Natürlich gibt es Fälle, wo es nicht eindeutig ist, welcher Rückgabewert gemeint ist, dann muss man es halt hinschreiben, aber ansonsten sollte man das nicht müssen.
Genau deshalb gibt es ja die Neuerungen in C++, die dieses Defizit reparieren.
-
DarkShadow44 schrieb:
qweasdyxc schrieb:
Man kann Funktionen sowieso nicht nur nach dem Rückgabetyp überladen
Um genau zu sein, kann man Funktionen nicht nach Rückgabetyp überladen, nur nach Parametern.
[/quote]
Das habe ich doch gesagt. Ersetze 'nur' durch 'ausschließlich'

-
Ethon schrieb:
Integer-Literale ohne Suffix sind doch standardmäßig ints.
Ah stimmt, Denkfehler.

nwp3 schrieb:
Die Frage, warum man überhaupt Rückgabewerte an Funktionen ranschreiben muss ist überhaupt nicht trivial, denn in den meisten Fällen ist es nämlich unnötig redundant.
Naja, z.B. wenn man eine externe lib hat die nur aus DLL + Header besteht muss man die Typen angeben.
Und ob sowas wie
auto func2(); auto func() { return func2(); } auto func2() { return irgendwas; }funktioniert kann ich leider nicht sagen, hab keinen C++14 Compiler zur Hand.
Wobei es meiner Meinung nach auch Vorteile hat wenn man den Typ der Funktion leicht erkennen kann, wenn alles nur voll mit "auto" ist kann das auch schnell unübersichtlicher werden, zumindest für einfache Typen.
-
@DarkShadow44~~
Natürlich geht das nicht.
Du kannst eine Funktion nur mit Returntyp auto deklarieren, wenn sie gleichzeitig auch definiert wird.
Da du die Funktion aber erstmal nur deklarieren willst, ohne Definition, kannst du nicht [c]auto[/c] als Returntyp verwenden.~~
EDIT: siehe unten
-
Du kannst eine Funktion nur mit Returntyp auto deklarieren, wenn sie gleichzeitig auch definiert wird.
Völlig falsch.
funktioniert kann ich leider nicht sagen, hab keinen C++14 Compiler zur Hand.
Brauchst du auch nicht, nur den Standard, der nämlich sagt, dass eine nur deklarierte Funktion dieser Art nicht aufgerufen werden darf, bis sie definiert ist (und der Rückgabewert feststeht).
§7.1.6.4/11 schrieb:
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.
-
Arcoth schrieb:
Brauchst du auch nicht, nur den Standard, der nämlich sagt, dass eine nur deklarierte Funktion dieser Art nicht aufgerufen werden darf, bis sie definiert ist (und der Rückgabewert feststeht).
Ah danke.

Bedeutet also, dass man auto nicht verwenden kann wenn die Funktion in einem anderem Sourcefile liegt. Also doch nicht so praktisch, wird man wohl doch meistens noch die Rückgabetypen angeben müssen.
-
Arcoth schrieb:
Du kannst eine Funktion nur mit Returntyp auto deklarieren, wenn sie gleichzeitig auch definiert wird.
Völlig falsch.
Upps, peinlich!
Danke für die Korrektur.Weisst du vielleicht wofür es dann überhaupt erlaubt ist die Funktion zu deklarieren? Mir fällt gerade nix ein was man damit machen könnte, was nicht auch ginge wenn die Deklaration ganz verboten wäre.
-
auto f1(); auto f2(){ return f1(); //klappt nur wegen deklaration } auto f1(){ return 42; }
-
nwp3 schrieb:
auto f1(); auto f2(){ return f1(); //klappt nur wegen deklaration } auto f1(){ return 42; }Nö, klappt nicht. Der Rückgabewert von f2 kann nicht bestimmt werden.
-
Weisst du vielleicht wofür es dann überhaupt erlaubt ist die Funktion zu deklarieren? Mir fällt gerade nix ein was man damit machen könnte, was nicht auch ginge wenn die Deklaration ganz verboten wäre.
Nein.
Ich meine, wie jede Deklaration bringt es einen neuen Namen in den Scope. Vielleicht kann man sich den Namen so im Voraus "reservieren", aber das ist schon an den Haaren herbeigezogen.Andererseits sind auch nicht lokale Funktionsdeklarationen verboten...