const?? When and why? This is ugly!
Walter Bright
newshound1 at digitalmars.com
Sun Mar 8 01:34:24 PST 2009
Burton Radons wrote:
> Obviously I made it contrived so that it's as clear as possible what
> the issue is. In reality, it will be going through more layers.
> Here's one layer:
>
> int [] a = new int [1]; a [0] = 1;
>
> invariant (int) [] func (invariant (int) [] a) { return a; }
>
> auto b = func (cast (invariant (int) []) a);
>
> Notice this has the same pattern as std.string.replace; that's why I
> did that cast.
>
> a [0] += b [0]; a [0] += b [0]; writef ("%s\n", a [0]); // Not
> optimised: 4. // Assuming b cannot be modified: 3.
>
> When this actually crops up in bugs the reality will be far more
> complex and practically impossible to discover.
The solution is, when you cast things to invariant, that's a one way
ticket. You cannot continue to mutate the original. If you find you need
to, the data must be duplicated, and the duplicate made invariant. If
this is done a lot, it's time to refactor the program.
Casts are greppable, and should be reviewed anyway. In this case,
casting an array to immutable should be followed by NO further
references to the mutable version.
More information about the Digitalmars-d
mailing list