On Sep 28, 2010, at 4:26 PM, David Levin wrote: > This came up before: > https://lists.webkit.org/pipermail/webkit-dev/2010-May/012873.html but I'd > like to understand it a bit better. > > It feels there were two points of view: > Use explicit only when necessary to prevent an undesirable implicit > conversion like int to vector. > Use explicit except when it is desirable to allow an implicit conversion that > makes the code simpler. For example, the String <-> AtomicString makes the > bindings generator code simpler since it doesn't need to know which the > underlying method takes. > Are there any reasons beyond personal preference to select either of these? > > Starting list: > > Pro's for #1 > It is a pain to remember to put explicit every time you have a constructor > with one argument. > > Pro's for #2 > It would prevent accidental mistakes that happen with implicit > constructors.
I think the rule should be something like: 3. Do not explicit when the single-argument constructor can be thought of as a type conversion - the class will be in some sense an alternate form of its sole parameter. Do use explicit when the single-argument constructor is *not* reasonably thought of as a type conversion - the single argument just happens to be the sole initialization parameter. Or to put it another way - can you imagine having a type conversion operator overload that does the same thing as this constroctor? Applying this rule to your two examples, Vector(int) should be explicit, because it doesn't convert the int to a vector, it uses the int as a size instead of the default one. But String(AtomicString) or AtomicString(String) need not be explicit, since they convert from one string type to another, carrying largely the same data. I realize this rule requires some judgment, so it's worse than a purely mechanical rule, but I think it accurately captures the proper use of explicit. Regards, Maciej
_______________________________________________ webkit-dev mailing list webkit-dev@lists.webkit.org http://lists.webkit.org/mailman/listinfo.cgi/webkit-dev