On Friday, 12 October 2012 at 08:20:42 UTC, Jonathan M Davis wrote:

Really, I think that it's a bad design decision to require that the invariant be called before opAssign. It does _not_ play nice with some of D's other features, and the result is likely to be that invariants get used less, meaning that code is more likely to be buggy.

You make a good argument, but you can also override opAssign for things that are not it's type exact type. So...

 struct S {
   float x;

   ref S opAssign(int y) {
     x = y;
     return this;
   }
 }

 S s;
 int i;
 s = i; //opAssign, correct?


In cases like this opAssign would need an invariant before and after the call. But if you were just replacing the whole object you wouldn't.

I'll say a @novariant is the better answer, and automatically used on the default copy/opAssign/postblitz (before the call, but still needed after).

Reply via email to