How to fix opAssign signature

Dan dbdavidson at yahoo.com
Wed Nov 7 09:52:43 PST 2012


On Friday, 2 November 2012 at 15:56:47 UTC, Ali Çehreli wrote:
>
>     ref D opAssign(D other) {
>         swap(c, other.c);
>         return this;
>     }
>
> There may be corner cases where this is not efficient, but 
> considering that assignment involves two sub-operations (make a 
> copy of the new state and destroy the old state), the above is 
> doing exactly that. (It is the same idiom for strongly 
> exception-safe operator= in C++.)
>
> That has been the observation that led me to understand that 
> by-value is the way to go with struct opAssign. Please let us 
> know whether it has weaknesses. :)
>
[snip]
> Ali

Neat trick. But how do you deal with this?
D d1;
const(D) d2;
d1 = d2

As soon as I add an assoc array to A I need to implement an 
opAssign if I want to be able to assign a const(A) to an A. And I 
would want to be able to do that for this composition. Note the 
cast - is that safe?

import std.stdio;
struct B {
   private A _a;
   @property auto a(const ref A other) {
     _a = other;
   }
}

struct A {
   int[1024] i;   /// Very big making pass by value bad choice
   string[string] h;
   auto opAssign(const ref A other) {
     h = cast(typeof(h))other.h.dup;
   }
}

void main() {
   B b;
   A a = { [0], [ "foo" : "bar" ] };
   b.a = a;
}


Thanks
Dan





More information about the Digitalmars-d-learn mailing list