[erledigt, weil Denkfehler] Explicit Ctor(std::string) akzeptiert const char* ????



  • Kurz und bündig hier der Quellcode:

    #include <stdexcept>
    
    struct DivisionDurchNullException : public std::domain_error
    {
      explicit DivisionDurchNullException(std::string const& what_arg) : std::domain_error(what_arg) {}
    };
    
    class Foo
    {
    public:
      Foo(int n)
      {
        if (n == 0) throw DivisionDurchNullException("Division durch Null beim Erstellen eines Foo-Objektes.");
        /*...*/
      }
    };
    

    Nun habe ich beim ctor der Exception explicit hingeschrieben, also dürfte er doch eigentlich die implizite Konvertierung von const char* nach std::string nicht akzeptieren oder?
    Er schluckts aber, ich bekomme noch nichtmal ne Warnung (MSVC 2008 express).

    Hat jemand ne Erklärung?



  • Explizit bedeutet doch nur, dass man keinen std::string in gewissen Kontexten als DivisionDurchNullException auffassen darf.

    Also wenn du sowas hast (warum auch immer):

    void Function(DivisionDurchNullException x);
    

    Dann funktioniert der Aufruf nicht:

    std::string Str = "hallo";
    Function(Str);
    

    Dass ein const char* in einen std::string konvertierbar ist, liegt am std::string - dieser hat einen nicht expliziten Konstruktor für const char* .



  • Auch der Comeau schluckt das, selbst im strict-mode.



  • Nexus schrieb:

    Explizit bedeutet doch nur, dass man keinen std::string in gewissen Kontexten als DivisionDurchNullException auffassen darf.

    Meep. Stimmt, Denkfehler meinerseits. Explicit bedeutet der Ctor kann nicht implizit aufgerufen werden, nicht dass das Argument nicht impllizit umgewandelt werden dürfte. Danke...



  • Hui?? schrieb:

    Auch der Comeau schluckt das, selbst im strict-mode.

    Logo, weil nichts falsch ist. Ist wie Nexus gesagt hat.
    Simon



  • Das explicit bedeutet nur, dass du den Konstruktor explizit aufrufen musst und nicht eine Zuweisung für den Aufruf benutzen darfst. Die implizite Umwandlung von const char * in const std::string & hat damit nichts zu tun 🙂



  • /rant/ schrieb:

    Das explicit bedeutet nur, dass du den Konstruktor explizit aufrufen musst und nicht eine Zuweisung für den Aufruf benutzen darfst.

    Nicht nur - wie erwähnt kommt es in keinem Kontext zu einer impliziten Umwandlung. Der explizite Konstruktoraufruf ist die einzige Möglichkeit für eine Konvertierung.



  • pumuckl schrieb:

    struct DivisionDurchNullException : public std::domain_error
    {
      explicit DivisionDurchNullException(std::string const& what_arg) : std::domain_error(what_arg) {}
    };
    

    hab mich gerade über den string-parameter gewundert - warum nimmt logic_error eigentlich std::string statt char* ? ist das nicht gefährlich, weil im string-konstruktor bad_alloc geworfen werden könnte?

    @pumuckl: warum heißt die struct nicht DivisionDurchNullAusnahme? (nur halb ernst gemeint - mich schüttelts bloß bei denglisch) 🙂


Anmelden zum Antworten