On Tuesday, 31 January 2017 at 17:20:00 UTC, John Colvin wrote:
It's a bug, please report it. The initializer should be
statically disallowed.
Adding a .dup works around the problem.
OK. Hmm, but the real use case was a bit more complicated, more
like:
-----
int n = 10;
foreach (i; 0..n)
foreach (j; 0..n)
foreach (k; 0..n)
... and maybe a couple more ...
if ([i: true, j: true, k: true].length == 3)
{...} // i, j, k is a set of distinct values
-----
Here, we don't know i, j and k statically, yet the problem is the
same.
Anyway, I'll file a bug report.
By the way, you can do sets like this, avoiding storing any
dummy values, only keys:
struct Set(T)
{
void[0][T] data;
void insert(T x)
{
data[x] = (void[0]).init;
}
void remove(T x)
{
data.remove(x);
}
bool opBinaryRight(string op : "in")(T e)
{
return !!(e in data);
}
// other things like length, etc.
}
unittest
{
Set!int s;
s.insert(4);
assert(4 in s);
s.remove(4);
assert(4 !in s);
}
Yeah, thanks for the recipe! I usually do bool [key] since it
does not add much overhead, but would definitely like the real
set (void[0] or otherwise) when performance matters.
Ivan Kazmenko.