I Couldn't work out why my Value listener wasn't getting calle. But turns out that copying the Value object doesn't actually copy the listeners. (I was putting the listener on a value in a struct and then putting the struct in a std::vector).
Anyway - skimming the source it looks like the move operation on Value won't copy the listeners either. I assume that'll corrupt my stuff if my vector expands.
Though it's a bit irrelevant because changing the capacity on the vector makes ~Value() dereference a null pointer. An assert in ReferenceCountedObjectPtr triggers. I've not figured out quite why yet.
Anyway - I"m going to put the structure on the heap and have a a pointer to it to avoid all this.
I'm wondering if it'd be better if the Value couldn't be copied at all! Though bound to break stuff.
So big(ger) warnings in the documentation instead?