enum class im Konstruktor lässt int-Werte zu



  • kurze Frage: wenn ich das richtig verstanden hab, sollte eine enum class doch jegliche implizite Konvertierungen zu int unterbinden, richtig? Warum geht im Builder (bcc32c) dann das hier ohne sämtliche Fehler oder Warnungen?:

    enum class myenum {A=1, B, C};
        
    class Foo
    {
        public:
          Foo(myenum const e, std::string const& s, int const i) : e(e), s(s), i(i) {};
        
        private:
          myenum e;
          std::string s;
          int i;
    }
    
    Foo(2, __FILE__, __LINE__);  //sollte doch eigtl nen Compiler-Fehler geben ??
    

    Zweite Frage: Gibt es ne andere Möglichkeit int-Werte zu unterbinden und tatsächlich nur myenum Werte zuzulassen?



  • Sollte so sein.

    Also mein MINGW bringt den Fehler korrekt.

    enum class MyEnum { A = 1, B, C };
    
    void testFunctionCall( int myenum_test )
    {
    }
    
    int main()
    {
        MyEnum test = MyEnum::A;
        testFunctionCall( test );
        return 0;
    }
    

    D:\projects\test\main.cpp|16|error: cannot convert 'MyEnum' to 'int' for argument '1' to 'void testFunctionCall(int)'|

    Ich vermute mal dass der CBuilder da einfach den Standard nicht sauber implementiert hat.



  • @drummi sagte in enum class im Konstruktor lässt int-Werte zu:

    kurze Frage:

    wäre es, wenn eine einfaches Minimalbeispiel vorhanden wäre.



  • @It0101 mhh okay, würd mich nicht wundern ... aber gut zu wissen, dass es theoretisch zumindest so is

    EDIT: Asche auf mein Haupt 🤫 ich hab bei der ganzen Suche übersehen, dass ich dadrin noch nen Konstruktor hab, der nen String als Parameter annimmt. Und dann hat der gute Compiler gedacht, machen wir doch mal ne implizite Konvertierung zu nem String. Darum ging es ohne Fehler... (wobei die Theorie, dass der Builder unsauber arbeitet ja nicht so abwägig gewesen wäre.. leider 😕 )
    Wenn ich den Konstruktor jetzt mit int explizit als gelöscht markiere,

    Foo(int const i, std::string const& s, int const i) = delete;
    

    gehts immerhin, er macht keine implizite Konvertierung zum String oder sonstwas, sondern weist mich darauf hin, dass ich das ja nicht wollte. Falls jmd nen besseren Vorschlag hat, gerne 🙂



  • @drummi Das ist genau der Grund warum eine Frage ohne minimalem, vollständigem und kompilierbarem Beispiel meistens völlig Banane ist.



  • @Swordfish kompilierbar war es ja so (abgesehen davon dass die string-Header gefehlt hat), ich dachte nur ich beschränke mich lieber auf das Wesentliche, ums verständlich zu halten, aber okay, weiß ich fürs nächste mal Bescheid. Man lernt ja immer dazu 😉



  • @drummi sagte in enum class im Konstruktor lässt int-Werte zu:

    Und dann hat der gute Compiler gedacht, machen wir doch mal ne implizite Konvertierung zu nem String.

    Ne implizite Konvertierung von "enum class" auf std::string? Das klingt ja noch viel schlimmer als die Theorie vorher...


Anmelden zum Antworten