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