On Wednesday, 29 December 2021 at 01:11:13 UTC, Stanislav Blinov wrote:
> Because opIndexAssign cannot distinguish at compile time between initialization and assignment:
Stuff[Key] aa;
aa[key] = Stuff(args); // ostensibly, initialization
aa[key] = otherStuff; // assignment to existing value
Same syntax, different behavior. This can only be caught at runtime. require
and update
though should be able to pull this off, and that they don't is a bug.
So i wonder if const and immutable would have different behaviors then.
While you shouldn't be able to explicitly change a const item within a struct, replacing the whole struct i would think would be okay, on the basis that you're basically throwing whole old item away (and may be equal to what you'd do with say swap).
Immutable on the other hand may want to refuse as it should basically have a lifetime of the array? Though if you can delete the item and then just add it in again it's a longer version of the same thing, just depends on if anything is using/referencing it or not. And casting away the constness is easy enough so maybe it won't be different.
Though if it's a basic type it seems unlikely it would need a longer lifetime, and if it's a reference or array it already is separated from the struct and needs no such protection for the pointer.
I don't know. I remember odd behavior with const/non-const stuff before.