Hello, I have a problem with using std.range.choose():

When using std.range.choose() on a range R, for which hasElaborateCopyConstructor!R is true, then a postblit for the result of std.range.choose() is created, which includes a call to R.__postblit(). However, hasElaborateCopyConstructor!R may be true, even if R does not define this(this), for example in the case that one of the members of R does so.

The example that I encountered (reduced to a minimum) was the the following:

import std.stdio : stdin;
import std.range: choose;

void main()
{
    ubyte[1][] secondRange;
    choose(true, stdin.byChunk(1), secondRange);
}

In this case File defines this(this), but ByChunk does not, so the above code does not compile.

I think what std.range.choose() does here is completely unnecessary: When the result of std.range.choose() gets copied, the underyling range gets copied, and if it implements postblit, it is automatically called. No need to call it explicitly, right?.

Reply via email to