Übersetzungsfehler in C++11 wegen Rückgabetyp von auto
-
Ist es eigentlich denkbar, daß der return type vor dem Funktionsnamen damit irgendwann wegfällt?
auto foo() -> int { return 42; }=>
foo() -> int { return 42; }?
-
Swordfish schrieb:
Ist es eigentlich denkbar, daß der return type vor dem Funktionsnamen damit irgendwann wegfällt?
auto foo() -> int { return 42; }Was hat eigentlich das auto hier noch zu bedeuten? Ist doch überflüssig, wenn der Typ am Ende sowieso angegeben wird?
-
out schrieb:
Was hat eigentlich das auto hier noch zu bedeuten? Ist doch überflüssig, wenn der Typ am Ende sowieso angegeben wird?
Ist notwendig, um eine unzweideutige Syntax hinzubekommen:
foo()->bar;Ist das
a) eine Funktionsdeklaration namens foo mit Rückgabetyp bar
b) der Aufruf einer Funktion foo, die einen (smart-)pointer auf X zurückgibt, über den auf die Membervariable X::bar zugegriffen wird?
-
Swordfish schrieb:
Ist es eigentlich denkbar, daß der return type vor dem Funktionsnamen damit irgendwann wegfällt?
auto foo() -> int { return 42; }=>
foo() -> int { return 42; }?
Unwahrscheinlich, das wäre dann ungefähr so wie das implizite int in C.
Ich hätte mir ja gewünscht, dass statt dessen die Angabe des Rückgabewertes weggelassen werden kann, so wie es bei Lambdas der Fall ist.auto foo() { return 42; }So wurde das ja auch urspünglich mal vorgeschlagen.
-
Das heißt,
auto foo() { if( std::rand() % 2 ) { return std::string( "bar" ); } else { return 42; } }würde mal
std::stringmalintzurückgeben?
-
Swordfish schrieb:
Das heißt,
auto foo() { if( std::rand() % 2 ) { return std::string( "bar" ); } else { return 42; } }würde mal
std::stringmalintzurückgeben?Nein. Das ist nicht möglich, der Compiler braucht schließlich einen festen Typ. Heutige Lambdas brauchen für sowas einen expliziten Rückgabetypen (alles, was mehr als nur ein statement (das return-statement) enthält braucht einen Rückgabetypen). Wenn man das etwas aufbohren will, müssten alle return-statements den gleichen Returntypen enthalten, damit der Compiler was ordentliches draus machen kann.
-
Würde, pumuckl, in einer zukünftigen - möglicherweise unmöglichen? - Version von C++.
-
@Kellerautomat: "Gibt es einen Grund, warum du trailing return types verwendest?"
Keinen allgemein nützlichen, nur einen persönlichen
Ich finde es irgendwie verständlicher. Wenn ich auto int foo() schreiben würde, könnte ich auto ja gleich weglassen.. (kommt mir so vor). Und bei dem "->" Zeichen stellt sich mein Gehirn immer den Satz "aus auto wird (->) int" vor. Also rein persönlich. 
-
Kellerautomat schrieb:
Gibt es einen Grund, warum du trailing return types verwendest?
Beispiele:
template <typename T> auto add(T a, T b) -> decltype(a+b);- Übersichtlichkeit
- nested Klassen müssen nicht referenziert werden
-
init01 schrieb:
[...] Wenn ich auto int foo() schreiben würde, könnte ich auto ja gleich weglassen..
Ne, nicht "könnte weglassen" du "müsstest weglassen".

-
Cyres schrieb:
Kellerautomat schrieb:
Gibt es einen Grund, warum du trailing return types verwendest?
Beispiele:
template <typename T> auto add(T a, T b) -> decltype(a+b);- Übersichtlichkeit
- nested Klassen müssen nicht referenziert werden
Das es Gründe gibt ist ja unbestritten, aber die Frage bezog sich meiner Ansicht nach gezielt auf
auto find_primes(unsigned int bound) -> std::vector<unsigned int>
-
Cyres schrieb:
Beispiele: [...]
Du kannst mir glauben, ich weiss schon, wozu das gut ist. Im Falle des TE's gibt's aber keinen offensichtlichen, technischen Grund.
-
Kellerautomat schrieb:
Cyres schrieb:
Beispiele: [...]
Du kannst mir glauben, ich weiss schon, wozu das gut ist. Im Falle des TE's gibt's aber keinen offensichtlichen, technischen Grund.
Furble Wurble schrieb:
Das es Gründe gibt ist ja unbestritten, aber die Frage bezog sich meiner Ansicht nach gezielt auf [...]
Achso, ich dachte es wäre allgemein die Frage.
Aus o.g. Gründen schreibe ich in neuen Projekten allerdings alle Funktionen in der Schreibweise, eine Ausnahme sind da Prozeduren, die keinen Rückgabewert haben (void hat genausoviele Buchstaben wie auto und der Methodenname steht somit an der gleichen Stelle und man kann auf einen Blick zwischen Funktionen und Prozeduren unterscheiden)