MySQL++, vererbung von std::vector



  • UB ist für viele schwierig zu erfassen.. ein bisschen wie das NICHTS im Weltall oder die Division durch 0. 🕶



  • pumuckl schrieb:

    ich bins schrieb:

    Aber wenn ein Compiler an der Stelle nicht definitiv undefiniertes Verhalten implementiert, ist das doch nicht falsch.

    Möp. JEDER Compiler "implementiert" an der Stelle definitiv undefiniertes Verhalten. Wirklich. Echt wahr. Es ist nämlich völlig egal, was der Compiler macht, alles was er tut passt auf die Beschreibung "undefiniertes Verhalten". Undefiniertes Verhalten heißt: Da passiert irgendwas. Oder garnichts. Es kann alles passieren. Muss aber nicht. Wenn das Programm ordentlich compiliert, nicht abstürzt, und reproduzierbare Ergebnisse liefert, ist das standardkonform. Wenn der Compiler dir eine fette Warnung in rot auf den bildschirm zaubert, ist das standardkonform. Wenn der Compiler die Zeile einfach ignoriert, auch. Selbst wenn das erstelle Programm heimlich die Internetverbindung nutzt und du 45 Minuten später den Pizzaboten vor der Tür stehen hast mit einer Frutti di Mare, "macht dann 8,50, guten Appetit", dann ist das völlig standardkonform.
    Es kann sogar sein, dass dein Programm wirklich wirklich NIE Probleme macht mit deinem Compiler. Du hast aber keinerlei Garantie. Es kann immer funktionieren, außer bei Vollmond und wenn du grade die neue CD von Metallica exakt um Mitternacht eingelegt hast, dann kommt der Pizzabote eben doch, aber diesmal mit 20 Familienpizzen. Undefiniertes Verhalten eben. Vielleicht kann man damit leben. Aber wenn plötzlich der Kunde mitten in der Nacht anruft "Ich hab mir grade schöne Musik aufgelegt und dein Programm gestartet und plötzlich...", was dann? Wäre schon arg peinlich.

    Also mit dieser Beschreibung kann ich gar nichts anfangen. Ich habe das Verhalten beschrieben, wie das in der Praxis auftritt. Und da kam der Hinweis, die Beschreibung sei falsch. Diesen Hinweis würde ich gerne verstehen.

    Das Verhalten ist im Standard nicht vorgeschrieben, aber meines Wissens verhalten sich alle Compiler so. Das Verhalten ist nicht sinnvoll und deswegen sagt der Standard dem Compilerhersteller: gib Dir kein Mühe, irgendetwas sinnvolles daraus zu machen. Es ist erlaubt, das Problem einfach zu ignorieren.



  • ich bins schrieb:

    Ich habe das Verhalten beschrieben, wie das in der Praxis auftritt. Und da kam der Hinweis, die Beschreibung sei falsch.

    Ich habe mal frech behauptet, dass sei falsch, weil UB nicht (allgemein) beschrieben werden kann. Wenn es Dir lieber ist, können wir uns auch darauf einigen, dass alle Beschreibungen von UB richtig sind.
    Mir egal: alle falsch, alle richtig...Who cares? 😉

    Du kannst natürlich beschreiben, was Deine Implementierung macht, bzw. wie Du es machen würdest. Aber Deinem Posting habe ich nicht entnommen, dass Du eine bestimmte Implementierung im Sinn hast.

    Du verstehst, was ich meine?



  • pumuckl schrieb:

    ich bins schrieb:

    Aber wenn ein Compiler an der Stelle nicht definitiv undefiniertes Verhalten implementiert, ist das doch nicht falsch.

    Möp. JEDER Compiler "implementiert" an der Stelle definitiv undefiniertes Verhalten. Wirklich. Echt wahr. Es ist nämlich völlig egal, was der Compiler macht, alles was er tut passt auf die Beschreibung "undefiniertes Verhalten". Undefiniertes Verhalten heißt: Da passiert irgendwas. Oder garnichts. Es kann alles passieren. Muss aber nicht. Wenn das Programm ordentlich compiliert, nicht abstürzt, und reproduzierbare Ergebnisse liefert, ist das standardkonform. Wenn der Compiler dir eine fette Warnung in rot auf den bildschirm zaubert, ist das standardkonform. Wenn der Compiler die Zeile einfach ignoriert, auch. Selbst wenn das erstelle Programm heimlich die Internetverbindung nutzt und du 45 Minuten später den Pizzaboten vor der Tür stehen hast mit einer Frutti di Mare, "macht dann 8,50, guten Appetit", dann ist das völlig standardkonform.
    Es kann sogar sein, dass dein Programm wirklich wirklich NIE Probleme macht mit deinem Compiler. Du hast aber keinerlei Garantie. Es kann immer funktionieren, außer bei Vollmond und wenn du grade die neue CD von Metallica exakt um Mitternacht eingelegt hast, dann kommt der Pizzabote eben doch, aber diesmal mit 20 Familienpizzen. Undefiniertes Verhalten eben. Vielleicht kann man damit leben. Aber wenn plötzlich der Kunde mitten in der Nacht anruft "Ich hab mir grade schöne Musik aufgelegt und dein Programm gestartet und plötzlich...", was dann? Wäre schon arg peinlich.

    Danke für den Lacher. 😉

    Vielleicht habe ich Ethons "Wieso hat man das?" falsch interpretiert. Eben dahingehend, dass er dass ausdiskutieren will...

    Ich habe den Drang jedes Sprachfeature gedanklich sofort auf low-level Ebene zu übersetzen. Wenn ich Verebung höre, denke ich nicht an Vererbung, sondern an VTables und sonstiges.
    Mir war klar dass es so nicht erlaubt ist laut Sprachstandard, aber ich konnte mir kein abweichendes Verhalten vorstellen. pumuckl hat mich netterweise auf die Lücke in meinen Gedanken hingewiesen, dass hier ja Mehrfachvererbung im Spiel ist.
    Mir geht es bei soetwas immer um die Technik dahinter, an den Sprachstandard halte ich mich zwar, interessant ist er aber nicht.



  • ich bins schrieb:

    Also mit dieser Beschreibung kann ich gar nichts anfangen. Ich habe das Verhalten beschrieben, wie das in der Praxis auftritt.

    Du hast das Verhalten beschrieben, wie es in den dir bekannten Fällen in der Praxis aufgerteten ist - und zwar hast du es so beschrieben als ob es sowieso immer so auftritt und immer so auftreten wird. Und eben das ist falsch, weil es eben explizit keinerlei Garantie gibt.

    Das Verhalten ist im Standard nicht vorgeschrieben, aber meines Wissens verhalten sich alle Compiler so.

    Ich habs mal hervorgehoben. Mal ehrlich, ohne dich angreifen zu wollen: was weißt du schon? Oder ich? Oder irgendwer? Ich hab einen Compiler geschrieben (ok, dem fehlen noch ein paar Features...), der den Vererbungskram völlig standardkonform umsetzt. Und wenn er die Vererbung und delete über den nichtvirtuellen Dtor im Code entdeckt, dann sucht er die DLL mit der API für pizza.de raus...
    Was ich damit sagen will: deines Wissens verhalten sich alle Compiler so - das Wissen ist in etwa garnichts wert, weil du nach wie vor keine Garantie hast.

    Ein ganz anderes Beispiel: meines Wissens ist jeder im Straßenverkehr halbwegs aufmerksam, schon aus Selbsterhaltungstrieb. Und bisher hat mich jeder gesehen, wenn ich über ne Kreuzung gefahren bin. Also kann ich problemlos über rot fahren, der Erfahrung nach überlebe ich das. Im Standard steht aber explizit drin, dass über rot fahren lebensgefährlich sein kann, und all die Erfahrung und all das "soweit ich weiß" bringt dir garnichts, wenn MSVC 2015 sich in ein paar Jahren entscheidet, dir im richtigen Augenblick den großen Sattelschlepper entgegenzuschicken, obwohl das bisher noch nie passiert ist, wenn du über rot gefahren bist. Also lieber die Minute oder zwei auf grün warten a.k.a. Vererbung und delete so verwenden, wie es der Standard vorsieht.


Anmelden zum Antworten