[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::stringin gewissen Kontexten alsDivisionDurchNullExceptionauffassen 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 einenstd::stringkonvertierbar ist, liegt amstd::string- dieser hat einen nicht expliziten Konstruktor fürconst char*.
-
Auch der Comeau schluckt das, selbst im strict-mode.
-
Nexus schrieb:
Explizit bedeutet doch nur, dass man keinen
std::stringin gewissen Kontexten alsDivisionDurchNullExceptionauffassen 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
explicitbedeutet nur, dass du den Konstruktor explizit aufrufen musst und nicht eine Zuweisung für den Aufruf benutzen darfst. Die implizite Umwandlung vonconst char *inconst std::string &hat damit nichts zu tun
-
/rant/ schrieb:
Das
explicitbedeutet 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_erroreigentlichstd::stringstattchar*? ist das nicht gefährlich, weil im string-konstruktorbad_allocgeworfen werden könnte?@pumuckl: warum heißt die struct nicht DivisionDurchNullAusnahme? (nur halb ernst gemeint - mich schüttelts bloß bei denglisch)
