Why char[] is not @nogc on this case

Jonathan M Davis newsgroup.d at jmdavisprog.com
Fri May 25 00:15:49 UTC 2018


On Friday, May 25, 2018 00:09:28 SrMordred via Digitalmars-d-learn wrote:
> On Friday, 25 May 2018 at 00:04:10 UTC, Adam D. Ruppe wrote:
> > On Thursday, 24 May 2018 at 23:55:24 UTC, SrMordred wrote:
> >> //Error: @nogc delegate onlineapp.main.__lambda1 cannot call
> >> non- at nogc function std.range.chain!(char[],
> >> char[]).chain.Result.front
> >>
> >> Why?
> >
> > phobos automatically decodes utf8 into dchars. This can throw a
> > new utf exception.
>
> Oh its the utf8 decode thing.
> I forgot about it.
> I thought that it only decodes when using strings and dchars.

It happens with any "narrow string" - i.e. any array of char or dchar. You
can test for it with std.traits.isNarrowString, whose current implementation
is:

enum bool isNarrowString(T) = isSomeString!T && !is(T : const dchar[]);

Basically, unless a range-based function goes out of its way to specialize
for narrow strings and avoids any decoding (and whether that makes any sense
depends on what the function does), it's going to treat any array of char or
wchar as a range of dchar and will throw a UTFException on invalid Unicode.

- Jonathan M Davis



More information about the Digitalmars-d-learn mailing list