C++11 auto als return type
-
Lambdas können den Rückgabetyp herleiten:
#include <string> static const auto fkt = []() { std::string s = "hallo welt"; return s; }; int main() { auto s = fkt(); }
-
Es ist schon deswegen sinnlos auto als Rückgabetyp anzugeben, weil der Compiler bei der Funktionsdeklaration dann ja die Implementierung kennen müsste. Das bedeutet, dass bei regelmäßiger Benutzung von auto als Rückgabetyp (angenommen, es würde funktionieren) die Compilezeit extrem groß wird. Nichts Wünschenswertes, möchte ich meinen.
-
Eisflamme schrieb:
Es ist schon deswegen sinnlos auto als Rückgabetyp anzugeben, weil der Compiler bei der Funktionsdeklaration dann ja die Implementierung kennen müsste. Das bedeutet, dass bei regelmäßiger Benutzung von auto als Rückgabetyp (angenommen, es würde funktionieren) die Compilezeit extrem groß wird. Nichts Wünschenswertes, möchte ich meinen.
Ja, das wäre wohl so. Aber er muss sie doch auch gar nicht kennen. Wie "auto" geschrieben hat, löst der
trailing return type
das Problem. Der Compiler weiß dann ja wieder, was der Rückgabetyp ist.
-
TyRoXx schrieb:
Lambdas können den Rückgabetyp herleiten:
[cpp]
#include <string>static const auto fkt = []()
{
std::string s = "hallo welt";
return s;
};Nö! Das mit dem Herleiten des Rückgabetyps funktioniert nur, wenn der Funktionskörper nur ein return-Statement als einzige Anweisung enthält.
-
krümelkacker schrieb:
TyRoXx schrieb:
Lambdas können den Rückgabetyp herleiten:
[cpp]
#include <string>static const auto fkt = []()
{
std::string s = "hallo welt";
return s;
};Nö! Das mit dem Herleiten des Rückgabetyps funktioniert nur, wenn der Funktionskörper nur ein return-Statement als einzige Anweisung enthält.
Entweder kann GCC mehr als der Standard verlangt (und Wikipedia lügt) oder du verwechselst das gerade mit
constexpr
.EDIT: Ah, du hast Recht. Diese Lockerung der Regeln ist nur ein Proposal, welches aber schon in GCC implementiert ist (und Clang).
-
auto schrieb:
(hier std::string)
Wenn schon wär's wohl eher
char const *
.
-
Swordfish schrieb:
auto schrieb:
(hier std::string)
Wenn schon wär's wohl eher
char const *
.Und wenn man es ganz genau nimmt, ist
"hallo welt"
vom Typconst char[]
-
out schrieb:
Swordfish schrieb:
auto schrieb:
(hier std::string)
Wenn schon wär's wohl eher
char const *
.Und wenn man es ganz genau nimmt, ist
"hallo welt"
vom Typconst char[]
const char[11]
, oder nicht?
-
Sone schrieb:
out schrieb:
Swordfish schrieb:
auto schrieb:
(hier std::string)
Wenn schon wär's wohl eher
char const *
.Und wenn man es ganz genau nimmt, ist
"hallo welt"
vom Typconst char[]
const char[11]
, oder nicht?Genau, jez hommers ganz perfekt.:D
-
out schrieb:
Sone schrieb:
const char[11]
, oder nicht?Genau, jez hommers ganz perfekt.:D
Nö. Der Rückgabetyp wäre sicher nicht
const char[11]
sondern müsste entweder tatsächlich zuconst char*
zerfallen oder implizit in eine Referenz konvertiert werden (sollte man höchstens beiauto& fkt()
machen).
-
pumuckl schrieb:
out schrieb:
Sone schrieb:
const char[11]
, oder nicht?Genau, jez hommers ganz perfekt.:D
Nö. Der Rückgabetyp wäre sicher nicht
const char[11]
sondern müsste entweder tatsächlich zuconst char*
zerfallen oder implizit in eine Referenz konvertiert werden (sollte man höchstens beiauto& fkt()
machen).Ich zumindest meinte damit eher den Typ des Literals.
Beim rval haste aber natürlich Recht, da greift das Array-to-Pointer decay.
-
pumuckl schrieb:
out schrieb:
Sone schrieb:
const char[11]
, oder nicht?Genau, jez hommers ganz perfekt.:D
Nö. Der Rückgabetyp wäre sicher nicht
const char[11]
sondern müsste entweder tatsächlich zuconst char*
zerfallen oder implizit in eine Referenz konvertiert werden (sollte man höchstens beiauto& fkt()
machen).Ja schon. Sone und ich haben uns aber direkt auf das Zeichenkettenliteral bezogen. Irgendeinem Anfänger hilft das sicher zu einem Aha-Effekt. Viele denken fälschlicherweise, dass ein Zeichenkettenliteral vom Typ
const char*
ist. Bei der Rückgabe muss natürlich konvertiert werden, da man ja Arrays nicht zurückgeben kann.