problem mit KOnstanten



  • in einem 5 zeiler einfach ein muss, da verliert man so schnell die übersicht.. :p



  • dragon90# schrieb:

    in einem 5 zeiler einfach ein muss, da verliert man so schnell die übersicht.. :p

    hm ok, aber ich dachte es geht darum (hast du ja selbst gesagt 😃 ):

    dragon90# schrieb:

    damit du siehts wie das geht:



  • Hallo

    dragon90# schrieb:

    Am besten mach alle Variablen immer konstant, dann änderst du sie nie unbeabsichtig.

    Weiß nicht genau, ob das ein Witz sein soll, aber das halte ich absolut nicht für sinnvoll. Wenn sich der Wert ändert dann Variablen sonst konstante Variablen (so ein blödes Wort), also Konstanten.

    chrische



  • Also das ist natürlich ganz besonders großer Schwachsinn, keine Frage.

    1. Ist die zusätzliche Schreibarbeit um die Konstanten dann doch zu ändern (Konstante? Ändern? wie jetzt 😮) viel zu hoch
    2. Darf man Konstanten nicht ändern (ach 😮)

    Ich habe erst kürzlich einen Fall erlebt, wo mit const_cast eine Konstante änderbar gemacht und auch geändert wurde, und sie wurde nicht wirklich geändert (obwohl keine Compilefehler) ➡ undefiniertes Verhalten wollen wir wohl nicht oder?

    IMHO ist die einzige Daseinsberechtigung für const_cast, wenn man eine API benutzt die nicht const-correct ist, von der man aber weiss dass sie bestimmte Werte nicht selbst verändert.


  • Mod

    dragon90# schrieb:

    Am besten mach alle Variablen immer konstant, dann änderst du sie nie unbeabsichtig.

    Habe dein Programm mal sicher gemacht, damit du siehts wie das geht:

    #include <iostream>
    using namespace std;
    
    const double pi=3.14159;
    const double x = 0;
    const double y = 0;
    const double radius = 1.5;
    
    int main()
    {
    	*const_cast< double* >( &x ) = pi * radius * radius ;
    	*const_cast< double* >( &y ) = 2 * pi * radius;
    
    	cout << "\nKreisberechnung\n" << endl;
    
    	cout<<" radius: " <<radius<< endl;
    	cout <<"umfang : " << y << endl;
    	cout<<" flaeche "<<x << endl;
    	return 0;
    }
    

    das ist schlicht undefiniert. eine const qualifikation wegzucasten ist nur zulässig, wenn das zugrundeliegende objekt nicht const qualifiziert ist.



  • LordJaxom schrieb:

    IMHO ist die einzige Daseinsberechtigung für const_cast, wenn man eine API benutzt die nicht const-correct ist, von der man aber weiss dass sie bestimmte Werte nicht selbst verändert.

    camper schrieb:

    das ist schlicht undefiniert. eine const qualifikation wegzucasten ist nur zulässig, wenn das zugrundeliegende objekt nicht const qualifiziert ist.

    Hm, das heisst für mich dass o.a. auch schon undefiniert ist?
    (Schade :()

    EDIT:
    Wo bin ich nur mit meinen Gedanken - natürlich nur wenn das zugrundeliegende Objekt nicht const ist. Was aber wenn doch? (Also ich übergebe ein const Objekt an eine API, die eine non-const Referenz erwartet, dieses aber nicht ändert - muss ich jetzt meine Konstante wegen dieser API non-const definieren, oder darf ich const_casten?)



  • Hat es einen speziellen Grund, das mich alle wiederholen ? 🙄 😃



  • dragon90# schrieb:

    Am besten mach alle Variablen immer konstant, dann änderst du sie nie unbeabsichtig.

    Habe dein Programm mal sicher gemacht, damit du siehts wie das geht:

    #include <iostream>
    using namespace std;
    
    const double pi=3.14159;
    const double x = 0;
    const double y = 0;
    const double radius = 1.5;
    
    int main()
    {
    	*const_cast< double* >( &x ) = pi * radius * radius ;
    	*const_cast< double* >( &y ) = 2 * pi * radius;
    
    	cout << "\nKreisberechnung\n" << endl;
    
    	cout<<" radius: " <<radius<< endl;
    	cout <<"umfang : " << y << endl;
    	cout<<" flaeche "<<x << endl;
    	return 0;
    }
    

    😃 👍


  • Mod

    LordJaxom schrieb:

    Was aber wenn doch? (Also ich übergebe ein const Objekt an eine API, die eine non-const Referenz erwartet, dieses aber nicht ändert - muss ich jetzt meine Konstante wegen dieser API non-const definieren, oder darf ich const_casten?)

    du darfst casten. relevant ist 7.1.5.1/4, frei übersetzt: "Abgesehen von mutabledeklarierten membervariablen, die verändert werden dürfen, resultiert jeder versuch, ein konstantes objekt während seiner lebenszeit zu verändern, in undefiniertem verhalten". der cast selbst konstituiert ja noch keine veränderung.

    CodeFinder schrieb:

    Hat es einen speziellen Grund, das mich alle wiederholen ?

    das bezieht sich auf wen?



  • Wenn man das Programm mit dem VC kompiliert und ausführt stürzt es ab, auch kein wunder, da die Variablen in einem Read-Only Speicherbereich liegen.

    Ein Schreibzugriff über const_cast ist nur dann sicher (wie bereits erwähnt), wenn das Originalobjekt nicht const ist.

    Ich dachte es wäre eindeutig, dass das nen Scherz ist.


Anmelden zum Antworten