On Monday, 1 June 2015 at 16:40:38 UTC, Marc Schütz wrote:
On Monday, 1 June 2015 at 15:45:11 UTC, Andrei Alexandrescu wrote:
On 6/1/15 5:50 AM, "Marc =?UTF-8?B?U2Now7x0eiI=?= <[email protected]>" wrote:
On Monday, 1 June 2015 at 04:43:20 UTC, Andrei Alexandrescu wrote:
Also, object with destructors need to have more restrictions:

   S {
       ~this();
   }

   void foo() {
       S s;
       if(condition)
           bar(s);
       // <- should we run the destructor here?
   }

This can either be solved by making such cases non-eligible, or by "remembering" whether an object was moved using a hidden boolean variable. AFAIK the latter is incidentally the solution Rust chose.

This has been solved, we have move which obliterates the source with .init.

Huh? What does that have to do with the current topic?

The question is not what should happen when someone does a conditional _explicit_ move, but whether a move should be done _implicitly_ by the compiler given the above constellation, and how it deals with the destructor if yes.

Obviously, only Andrei can say for sure what he meant, but I would guess that he was suggesting that in the case of

if(condition)
   bar(s);

it would set s to S.init when it's moved for the call to bar so that the destructor can be run when s exits scope regardless of which branch was executed - though that does mean that the destructor is run twice when bar(s) is called (once inside of Bar for the original value and once for the init value) - so while that solution is correct and straightforward, I'm not sure that it's the best one.

- Jonathan M Davis

Reply via email to