On Monday, 27 October 2014 at 18:42:11 UTC, Marc Schütz wrote:
On Monday, 27 October 2014 at 16:58:56 UTC, Szymon Gatner wrote:
On Monday, 27 October 2014 at 14:04:53 UTC, Marc Schütz wrote:
On Monday, 27 October 2014 at 12:40:17 UTC, Shachar Shemesh
wrote:
On 27/10/14 11:31, Szymon Gatner wrote:
Right, sorry. Tho I admit I made assumptions since that was
not the full
code.
I've opened a bug. It has a fully contained sample (that
does not, in fact, implement smartptr).
https://issues.dlang.org/show_bug.cgi?id=13661
Strictly speaking, your opAssign is wrong, because it doesn't
swap source and destination, as it should. This doesn't
matter here, but it would for a smartptr.
However, that opAssign isn't even called is certainly a bug.
Why would opAssign() swap things?
This is necessary to make assignment exception safe (in the
general case). It's known as the copy-and-swap idiom in C++.
Here it's described in the D spec:
http://dlang.org/struct#assign-overload
For your example code it's not necessary, because there can
never be exceptions, but depending on what the smart pointer
does, it might throw in one of its members' opAssign, which
could lead to a partially copied object.
Copy-and-swap in C++ as the name implies requires 1) copy first -
a temporary copy-constructed object on created on the stack then
2) trivial/nothrow swap with that temporary. Your suggestion
sounded like source and destination of opAssign() were suppose to
be swapped. In C++ this is sometimes used when move-assigning.