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 Typ const 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 Typ const 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 Typ const 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 zu const char* zerfallen oder implizit in eine Referenz konvertiert werden (sollte man höchstens bei auto& 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 zu const char* zerfallen oder implizit in eine Referenz konvertiert werden (sollte man höchstens bei auto& 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 zu const char* zerfallen oder implizit in eine Referenz konvertiert werden (sollte man höchstens bei auto& 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.


Anmelden zum Antworten