Postblit isn't called on rvalue return
Sebastian Graf
SebastianGraf at t-online.de
Wed Apr 24 14:36:47 PDT 2013
On Wednesday, 24 April 2013 at 20:53:11 UTC, Ali Çehreli wrote:
>
> First, as the local 's' in makeS() is local, it cannot be
> returned by ref. So, the 'auto ref' return type of makeS()
> becomes by-value.
>
> However, rvalues are never copied in D. The compiler
> automatically moves the bits of the rvalue to the left-hand
> side object, and to be correct, it also elides the destructor
> execution on the rvalue. (Note that this is not the RVO and
> NRVO optimization that C++ "allows". This is a language feature
> in D.)
>
> For that feature to be available at all, struct objects must
> not have references to themselves; D explicitly makes it
> illegal.
>
> So, unfortunately your S is not a valid type in D because of
> the following line (.ptr is added by me):
>
> s.b = s.buf.ptr;
>
> Ali
Thanks, this explains a lot. I was interfacing with a C library
when tracing back an error to this. I eagerly submitted a Bug
report http://d.puremagic.com/issues/show_bug.cgi?id=9985. Seems
to me that dmd doesn't do NRVO (?), see the issue.
More information about the Digitalmars-d-learn
mailing list