opAssign() calls members' postblits?

Ali Çehreli via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sat Jun 21 13:03:25 PDT 2014


On 06/21/2014 11:56 AM, "Marc Schütz" <schuetzm at gmx.net>" wrote:

 >      import std.stdio;
 >
 >      struct A {
 >          this(this) {
 >              writeln("A.this(this)");
 >          }
 >
 >          B b1, b2;
 >      }
 >
 >      struct B {
 >          this(this) {
 >              writeln("B.this(this)");
 >          }
 >      }
 >
 >      void main() {
 >          A a, b;
 >          a = b;
 >      }
 >
 > This outputs:
 >
 >      B.this(this)
 >      B.this(this)
 >      A.this(this)
 >
 > Now, http://dlang.org/struct.html#AssignOverload says:
 >
 >      ref S opAssign(S s)
 >      {

Note that opAssign takes by-value. The post-blits that you see are due 
that copy. i.e. b in main is copied to the argument that opAssign sees.

Also note that if the right-hand side in main() were an rvalue, then 
that copy would not involve any post-blit.

 >        S tmp = this;   // bitcopy this into tmp
 >        this = s;       // bitcopy s into this
 >        tmp.__dtor();   // call destructor on tmp
 >        return this;
 >      }
 >
 > Note the term "bitcopy", which for me implies that no postblits are
 > supposed to be called.
 >
 > What the compiler does makes sense to me, but it seems to contradict the
 > documentation. I guess the call to the postblit is missing in the
 > pseudo-code... Am I right?
 >
 > (DMD git 514db2e212ae52e1206d4296e48d4a689370d04b)

Ali



More information about the Digitalmars-d-learn mailing list