[Issue 6581] Yet another dtor/postblit problem?
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Tue Sep 20 07:37:36 PDT 2011
http://d.puremagic.com/issues/show_bug.cgi?id=6581
--- Comment #4 from Dmitry Olshansky <dmitry.olsh at gmail.com> 2011-09-20 07:37:10 PDT ---
> Please note this line:
> > a = A(dummy); // a(dummy) was a typo, thought it changes nothing
>
> This is "assignment", not initializing.
> The assignment of an object that has postblit (like A) is implemented *swap and
> destroy*.
Note this line was in constructor. No way to initialize member of a struct?
That's something I'd call unacceptable.
I should point out that move == swap & destroy, iff left side of assigment
_was_ initialized. A constructor may be called on chunk of uninitialized memory
e.g. in Phobos std.typecons.emplace.
> For this purpose, D compiler implements opAssign implicitly, like
> follows:
>
> struct A {
> ...
> ref A opAssign(A rhs) { // rhs is copyed from original value
why do we copying the original value in the first place?
It should be moved with e.g. memmov
> std.algorithm.swap(this, rhs); // bitwise swapping
> return rhs;
> // rhs is equals to original 'this', and it is destroyed here.
> }
> }
>
> Therefore, the assignment of an object of A always increment A.dtor.
Thanks, that clarifies it in part, but still how about initialization in
constructor?
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
More information about the Digitalmars-d-bugs
mailing list