Lambda in statischem Array



  • Ich kannte den nullptr-ctor von std::function einfach nicht, etwas ähnliches wird wohl knivils Problem gewesen sein. Wozu gibt es den, wieso nicht einfach = UserFunc() ?



  • Eisflamme schrieb:

    Wozu gibt es den

    Keine Ahnung. Überall, wo man explizit nullptr zuweist, dass heißt keinen Nullzeiger, könnte man gleich den Initializer weglassen (oder im Falle eines Funktionsparameters eben wie du gezeigt hast).

    Edit: Wahrscheinlich, weil man beim Argument nullptr sonst diesen Konstruktor bekommt:

    template< class F > function(F);
    

    Schließlich sollte das Zuweisen von nullptr eigentlich möglich sein.

    Eine andere Begründung wäre, dass der nullptr_t -Konstruktor noexcept ist, der copy/move-Ctor allerdings nicht.

    Ich dachte, knivil wusste nicht, dass man einer const -Referenz zuweisen kann...



  • Eisflamme schrieb:

    Wozu gibt es den

    Wahrscheinlich zur Konsistenz mit Funktionszeigern: Intuitiv wird erwartet, dass Funktionszeiger (inklusive nullptr ) zu std::function konvertierbar sind.

    void (*fn)(int) = nullptr;
    std::function<void(int)> fn = nullptr;
    

    Sone schrieb:

    Ich dachte, knivil wusste nicht, dass man Temporaries einer const -Referenz zuweisen kann...

    Selbst dann wäre die Reaktion ziemlich arrogant. Zumal du selbst nicht selten mit ähnlichen Dingen auffällst... Sei bitte etwas zurückhaltender, sonst machst du dich nur unbeliebt.



  • Okay, bin ja schon still. Tut mir wie gesagt Leid.



  • Nexus:
    Ah, natürlich. Okay, das leuchtet ein, danke 🙂



  • Sone schrieb:

    Okay, bin ja schon still. Tut mir wie gesagt Leid.

    Entschuldigung gut. Merken & in Zukunft besser machen wäre noch besser 😉

    BTW: ich hab' da auch erstmal kurz doof geguckt. An implizite Konstruktoren denkt man nicht immer gleich, und wenn einem dann nicht gleich einfällt/auffällt dass std::function nen impliziten Ctor mit einem Funktionszeiger nullptr_t -Argument hat...

    Sowas nicht sofort zu sehen bedeutet nicht dass man kein Basiswissen hat. Ich kenne auch nicht viele C++ Programmierer persönlich von denen ich annehme dass sie aus der Zeile überhaupt irgendwann schlau geworden wären. Und ich kenne ein paar zig C++ Programmierer die mit C++ ihr Brot verdienen.

    ps: Ich weiss dass "tut mir Leid" in Wirklichkeit keine Entschuldigung ist. Aber ich interpretiere es mal so - weil's halt meistens so gemeint ist.

    ps2: Sieshte, ich hätte es nichtmal selbst gewusst 🙂 Wäre davon ausgegangen dass es nen Non-Template-Overload gibt der nen Funktionszeiger mit exakt passender Signatur nimmt.



  • Ich persönlich wusste, was diese Zeile macht, aber auch nur, weil ich gestern noch mir die Konstruktorenübersicht von std::function angesehen hattte.
    (Unnötiger, vom Themen ablenkender Beitrag, der nur mein Ego stärkt FTW!)



  • Ich denke ich sollte auch noch etwas dazu sagen. Ich wusste beisielsweise, dass nullptr in std::function umwandelbar ist. Jedoch wusste ich nicht, dass wenn eine Referenz verlangt wird, auch ein Umweg ueber implizite Konvertierung zu einem Objekt erlaubt ist, von dem dann die Referenz genommen wird. Dachte es sei nur ohne Umweg erlaubt.

    Ich weiss, dass ein temporaeres Objekt an const-Referenzen binden. Und ich weiss auch, dass einige Kompiler sich nicht daran halten.



  • void f(std::string const&);
    
    f("Aber du hast doch sicher schon hundert mal sowas hier gesehen?");
    

    Sowas nicht sofort zu sehen bedeutet nicht dass man kein Basiswissen hat. Ich kenne auch nicht viele C++ Programmierer persönlich von denen ich annehme dass sie aus der Zeile überhaupt irgendwann schlau geworden wären. Und ich kenne ein paar zig C++ Programmierer die mit C++ ihr Brot verdienen.

    Hier gibt es aber einen Widerspruch. knivil ist viel erfahrener und schlauer als ich. Hätte er gewusst, dass das so möglich wäre, aber nicht geahnt, dass function einen solchen Konstruktor hat, dann wäre das sehr merkwürdig. Daher musste ich darauf tippen, dass er das "Feature" nicht kennt. Und das war überraschend.



  • Sone...

    Als "fortgeschrittener Anfänger" der gerade alle Features von irgendwas "frisch" gelernt hat, verfällt man leicht in den Glauben, dass jeder alte Hase alles im Schlaf können/wissen muss was man selbst kann/weiss. Ganz speziell wenn man diese Irgendwas nicht als Mittel zum Zweck sieht, sondern sich aus Neugier und Spass an der Sache in alle Details vertieft.
    Dieser Glaube entspricht aber nicht der Realität. Zumindest nicht bei nicht-trivialen Dingen wie Programmieren.

    Und ganz speziell bei C++11 Features wirst du viele alte Hasen finden die nix oder nicht viel davon wissen. Ich hab' mir z.B. std::function auch nie wirklich angesehen. Ich kenne und verwende seit langem boost::function , und hab' mich einfach mit Aussage zufriedengegeben dass std::function im Prinzip das selbe wie boost::function ist. Verwendet hab' ich std::function selbst auch noch nie. Unsere Projekte sind allesamt ziemlich gross, und es wurde noch keines auf nen C++11-fähigen Compiler umgestellt. Wäre einiges an Arbeit. Und alle Verwendungen von boost::function durch std::function wäre dann nochmal extra Aufwand. Den halt keiner zahlt.


Anmelden zum Antworten