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