New names - 2.068 roundup
Jonathan M Davis via Digitalmars-d
digitalmars-d at puremagic.com
Wed Jun 24 22:05:54 PDT 2015
On Thursday, 25 June 2015 at 03:40:31 UTC, Adam D. Ruppe wrote:
> (An interesting point here though is since alias this DOES
> return a string, any duck-type checks or implicit conversion
> checks will also pass what it passes... and work, it'll just
> silently allocate the string. Which is no regression! The
> status quo is it allocates that string EVERY time anyway. But
> it also isn't ideal.
That depends entirely on what the templated function that it's
being used with does. In general, implicit conversions in generic
code is an incredibly bad idea. Almost inevitably what happens is
that folks assume that because the type is implicitly
convertible, it can be treated like the type that it implicitly
converts to - but that often isn't true at all. It just means
that you can convert it to that type and then use it as that type
rather than its original type. So, if a function checks for
implicit conversion and then forces that conversion, then it can
work, but it needs to force the conversion. Otherwise, it'll
either fail to compile when used with types that use alias this,
or you'll end up with weird, hybrid behavior where some of the
operations might use the actual type, whereas others use the
converted type. In general, I think that using implicit
conversions in generic code is a disaster.
So, yes, if we use a struct like this, then in code which ends up
assigning the result to a string (or passing it to a function
which explicitly takes a string), then the implicit conversion
will take place, and everything should work fine. However, in any
code that assumes that it's dealing with strings but doesn't
actually use the type string anywhere, it's not going to
implicitly convert to string, and you could easily end up with
templated functions which test with isSomeString or similar and
thus fail to compile, because they wouldn't do the implicit
conversion in that case (the duck typing sees that the struct
_isn't_ a string). As long as the functions work with general
ranges of dchar, they should be fine (possibly less performant if
too much autodecoding is going on, but the lack of allocation may
make up for that), but any generic code that assumes strings
without specifically using the type string is in trouble. How
much of a concern that really is, I don't know. But I would not
expect much code that involves duck typing to be converting the
struct to string, and in general, I would be very worried about
any generic code that involved implicit conversions.
But this should work just fine when used with non-generic code
that's operating on strings or with generic code that operates on
ranges of dchar and not necessarily just strings.
- Jonathan M Davis
More information about the Digitalmars-d
mailing list