New names - 2.068 roundup

Jonathan M Davis via Digitalmars-d digitalmars-d at puremagic.com
Wed Jun 24 07:10:00 PDT 2015


On Wednesday, 24 June 2015 at 13:43:04 UTC, Jacob Carlborg wrote:
> Can't we update isSomeString to detect this use case?

We _could_ but that would be a disaster. The whole point of 
isSomeString is to test whether something is a string exactly. 
The code used by a function that's overloaded specifically on 
strings needs to operate on strings. If isSomeString suddenly 
accepted something which implicitly converted to a string rather 
than a string, then most functions which used isSomeString in 
their template constraints, would fail to compile when used with 
such a range. In general, implicit conversions in template 
constraints are incredibly dangerous - especially when alias this 
is involved - because unless the conversion is actually done, the 
type in question won't act exactly as whatever it converts to, 
and when given something that implicitly converts, it will either 
not compile, or it will have incorrect behavior.

A while back, it was temporarily changed so that isSomeString, 
isIntegeral, etc. accepted implicit conversions, but that was 
reverted fairly quickly, precisely because it's so dangerous. 
Templated functions should only be dealing with implicit 
conversions when they force the conversion.

We could choose to write overloads for Phobos functions which 
accepted ranges that implicitly converted to string, explicitly 
convert them to string, and then call the string overload, but 
then they'd always allocate, whereas maybe the overload which 
operated on non-strings would have been better, because it 
wouldn't have required any allocation. So really, what we need is 
to either change is that strings are ranges of their code unit 
type rather than dchar, or we need to be using byCodeUnit and 
friends a lot more. I believe that Walter has been trying to do 
that with the lazy versions of functions, but any of them which 
result in ranges of dchar are going to no longer be strings, and 
even those that use byCodeUnit won't be able to take advantage of 
overloads for strings or arrays anymore, because they won't be 
strings.

Part of what we need to do is go through Phobos and make it so 
that the various range-based functions which operate on strings 
operate on ranges of char just as well, then byCodeUnit and its 
ilk can be optimized appropriately. But they're not going to work 
with the current overloads which take strings, because they are 
neither arrays nor strings.

- Jonathan M Davis


More information about the Digitalmars-d mailing list