On Monday, 31 December 2012 at 16:29:27 UTC, monarch_dodra wrote:
But back to the original problem, I just think one shouldn't be able to call a const object a range. A "Range" is mutable by nature. Any attempt to pass one to an algorithm should fail (IMO).

This will break a lot of existing code.

This currently works:

immutable int[] a = [1, 2, 3];
auto b = array(a);

std.array.array is one of the few functions that uses std.traits.isIterable, so it works for immutable slices.


We just have a really special case regarding const slices. Even then, the only reason you can "iterate them" is because the compiler is implicitly copying a mutable slice behind the scenes. The const slice itself, technically, really isn't iterable (AFAIK)...

It could also iterate the indices:

immutable int[] a = [1, 2, 3];
foreach (i; 0..a.length)
    foo(a[i]);

Nothing illegal about that.

The specific issue I'm looking at is the joining of an immutable array of arrays. It should be allowed, because they can be iterated. In fact, if you just remove the template constraints from std.array.join then it works.

Reply via email to