On Tuesday, 5 February 2013 at 15:06:47 UTC, Maxim Fomin wrote:
The root of the problem is in:

struct DAssociativeArray(Key, Value)
{
    struct Slot
    {
        Value value;
    }
}

struct RC {
  this(this) {  }
}

void main()
{
    DAssociativeArray!(int, const(RC)) goo;
}

which doesn't compile (this is how Value[Key] is rewritten).


I see - thanks. I assume it should compile and without the postblit it does. So - the original code is fine and there is a D problem with associative arrays.

- Wouldn't the scenario be exactly the same without ValuationHistory? That is, if I comment out the member _valuationHistory, the goo member is not changed in structure at all, and yet it compiles just fine. - Does this mean that "no one" or "very few" developers store structs with postblits as value types in the standard associative array? Maybe I just do things differently than others.

The way I see it you have to choose how you want to develop your structs/classes. I have chosen to use structs and templates and avoid classes, thinking this would greatly simplify things. Any struct needs to establish up front whether it will have value semantics or reference semantics. So far, I have preferred value semantics as data sharing leads to confusion. So if I have arrays in a struct I include postblits to provide value semantics. In another thread Walter made clear his distaste for postblits and preference for reference semantics coupled with copy on write semantics where needed. That approach, just does not seem worth it without more systematic support for COW. Assuming postblits are the issue, I don't understand why they are so hard to get right.

Thanks
Dan

Reply via email to