On Friday, 11 October 2013 at 00:30:35 UTC, Simen Kjaeraas wrote:
Here's a COW reference type that I can easily pass to a function
requiring a mutable version of the type:
struct S {
immutable(int)[] arr;
}
And usage:
void foo(S s) {}
void main() {
const S s;
foo(s);
}
This compiles and works beautifully. Of course, no actual COW is
happening here, but COW is what the type system says has to
happen.
Another example COW type:
string;
Now, my point here is that BigInt could easily use an immutable
buffer internally, as long as it's purely COW. It could, and it
should.
If it did, we would not be having this discussion, as bugs
#11148 and
#11188 would not exist. Inventing rules like 'you should use
inout'
does not help - it's obscuring the problem.
TLDR: Do not use inout(T). Fix BigInt.
Good catch. immutable(T)[] is special.
Do the same with a contained associative array and you'll be my
hero.