Struct d'tors and destructive assignment of return vals

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Tue May 26 19:06:10 PDT 2009


dsimcha wrote:
> == Quote from Steven Schveighoffer (schveiguy at yahoo.com)'s article
>> On Tue, 26 May 2009 21:20:41 -0400, dsimcha <dsimcha at yahoo.com> wrote:
>>> import std.stdio;
>>>
>>> struct RC {
>>>     uint N;
>>>
>>>     this(this) {
>>>         writeln("Postblit:  ", N);
>>>     }
>>>
>>>     ~this() {
>>>         writeln("D'tor:  ", N);
>>>     }
>>> }
>>>
>>> RC fun() {
>>>     writeln("Doing stuff...");
>>>     return RC(3);
>>> }
>>>
>>>
>>> void main() {
>>>     RC foo = RC(1);
>>>     writeln("Calling fun()...");
>>>     foo = fun();
>>>     writeln("Exiting...");
>>> }
>>>
>>> Output:
>>>
>>> Calling fun()...
>>> Doing stuff...
>>> D'tor:  1
>>> Exiting...
>>> D'tor:  3
>>>
>>> Would it be feasible to require that, when a struct is being
>>> destructively
>>> assigned the return value of a function, the d'tor is called for the old
>>> contents before the function that provides the return value is called
>>> instead
>>> of calling it after?
>> What if fun throws an exception?
>> -Steve
> 
> Argh good point, didn't think of that.  Then I guess you're just screwed.  In that
> case, do you see any other way to get good COW semantics in this situation?

This has been discussed by Bartosz, Walter, and myself quite a lot a 
couple of years ago. The solution we settled on was to always move the 
bits directly when a copy is the last access of the source (as is the 
case in your return expression). Walter hasn't implemented that yet.

Andrei



More information about the Digitalmars-d mailing list