expicit für default-ctor???
-
Was soll das bringen??
Ich habe nämlich folgende Zeile in der istream gefunden:
explicit basic_istream(): _M_gcount(streamsize(0)) { }PS: Vielleicht ergibt es Sinn, wenn ich sage, dass das ganze im protected-Bereich steht!
-
"explicit" garantiert afaik nur, dass dieser konstruktor nicht für implizite konvertierungen verwendet wird. Es heisst nicht, dass man verbietet, das ding als default construktor zu benutzen.
-
Dass es funktioniert sehe ich auch, aber ich will wissen, ob das in irgend einem Fall auch sinnvoll sein kann???
-
es ist einfach insofern sinnvoll, dass der compiler daraus keinen unsinn bauen kann... das mit dem unsinn machen überlässt man damit einfach dem programmierer

was dabei genau schief gehen kann, wenn das irgendwo versehentlich implizit verwendet wird: keine ahnung... habe jetzt ehrlich gesagt keine zeit und keine lust, mich in den iostream header einzulesen...
, mach dir drum keine sorgen, die leute die das geschrieben haben hatten wohl schon ihre gründe, um diesen impliziten aufruf zu verbieten... 
Wenn du dir das jetzt aber alles durchlesen willst: bitte sehr. Wenn du rausgefunden hast, wozu das so ist, dann kannst du es mir vielleicht erzählen

-
basic_istream hat keinen Default-Konstruktor.
-
Ich schätze mal "explicit" ist deswegen einfach für jeden ctor erlaubt, damit keine "Unfälle" passieren können wenn man Änderungen am Code macht, z.B. dem 2. Parameter eines Konstruktors einen Default Wert verpasst, oder aber auch dem Default-ctor ein Parameter mit Default-Wert dazumacht.
In beiden Fällen würde aus einem ctor der zuvor nicht für implizite Konvertierungen verwendet werden konnte einer der nun sehrwohl verwendet werden kann. Wenn du da vergisst das explicit davorzuschreiben... bumm, du bist tot.
Also einfach immer vor jeden ctor "explicit" schreiben (es sei denn man WILL die implizite Konvertierung ermöglichen) und gut.
Eigentlich sollte implizite Konvertierung "opt in" sein und nicht "opt out", aber naja, "explicit" ist halt erst zu spät in den Standard gekommen, da konnte (wollte) man das Default-Verhalten nichtmehr ändern. So kenne ich zumindest die Geschichte...
-
@AGS'ler
explicit hat im besagten Beispiel keine Bedeutung. Der Standard sagt dazu zwar folgendes12.3.1-2 schrieb:
A default constructor may be an explicit constructor; such a constructor will be used to perform default-initialization or value-initialization (8.5).
Ich sehe da aber keinen Unterschied zum Verhalten ohne explicit.
explicit macht nur dort Sinn, wo ein ctor mit genau einem Argument aufgerufen werden kann. Damit wird einfach eine implizite Konvertierung unterbunden.