Constructor Initializer list mit Gnu Compiler Fehler wird erfolgreich Compiliert?



  • Hallo,
    lese grade den Primer 5th und bin bei der Aufgabe 7.36:

    Exercise 7.36:
     The following initializer is in error. Identify and fix the
    problem.
    struct X {
    X (int i, int j): base(i), rem(base % j) { }
    int rem, base;
    };
    

    Warum geht denn bitte mein Code:

    #include <iostream>
    
    struct X {
    X (int i, int j): base(i), rem(base % j) { }
    int rem, base;
    };
    
    int main(){
    	X(10,15);
    
    	std::cin.get();
    	return 0;
    }
    

    Bin ich völlig verwirrt oder liegt das daran das der Compiler anders Arbeitet?
    In Buch stand meine ich so was das eine Compiler das anders machen oder so. Bezieht sich das darauf? Eigentlich müsste das ja nicht gehen weil die Initializer list ja nicht die Reinfolge des Compilers ändert wie die Member(sind das Member?) initialisiert werden.

    Hoffe ihr könnt mir das etwas Aufschluss geben.



  • rem ist vor base deklariert. Deshalb wird rem(base % j) vor base(i) ausgeführt. Daher wird base vor der Initialisierung gelesen und dann wird rem Blödsinn zugewiesen.



  • Ah ok also macht das ganze nur blödsinnige Werte ist aber kein "richtiger" Error.



  • CraftPlorer schrieb:

    Ah ok also macht das ganze nur blödsinnige Werte ist aber kein "richtiger" Error.

    Würdest du Warnungen aktivieren, bekämst du deswegen auch eine Warnung.



  • CraftPlorer schrieb:

    Ah ok also macht das ganze nur blödsinnige Werte ist aber kein "richtiger" Error.

    Richtig, aber das ist somit auch ein (Logik-)Fehler, denn dein Programm macht in keinem Fall, was es soll (ausser mit ganz ganz viel Glück, wenn base zufällig mit dem Wert von rem initialisiert wird, aber du kannst dich drauf verlassen, dass das nicht passieren wird)


  • Mod

    CraftPlorer schrieb:

    kein "richtiger" Error.

    Das resultiert in undefiniertem Verhalten.



  • Danke an euch alle. War wohl ein bisschen verwirrt durch das Wort ERROR. Muss gleich mal bei Google schauen wie ich Warnings aktiviere.



  • Es ist schon ein "richtiger" Fehler, aber keiner wo "diagnostic required" wäre.
    Also keiner wo der Standard vorschreibt dass der Compiler es dir melden muss.


Log in to reply