Boost logo

Boost :

Subject: Re: [boost] [interprocess] default constructors
From: David Abrahams (dave_at_[hidden])
Date: 2008-12-05 19:45:30


on Fri Dec 05 2008, Mathias Gaunard <mathias.gaunard-AT-ens-lyon.org> wrote:

> David Abrahams wrote:
>> on Wed Dec 03 2008, Mathias Gaunard <mathias.gaunard-AT-ens-lyon.org> wrote:
>>
>>> David Abrahams wrote:
>>>
>>>> I don't think it's unfortunate. Destructive move semantics is nearly
>>>> impossible to use correctly in many conditions.
>>> Would you mind giving examples?
>>
>> void f()
>> {
>> X a;
>> if (something)
>> g(move(a));
>> // ... // a.~X() ?
>> }
>
> Indeed, in the general case, the compiler (this certainly shouldn't be
> the job of the programmer) would have to transform the code to
> something like that:
>
> void f()
> {
> X a;
> bool destruct_a = true;
>
> if (something)
> {
> g(move(a));
> destruct_a = false;
> }
> // ...
>
> if (destruct_a)
> a.~X();
> }

In general the compiler can't know.

   void f(X& a)
   {
       if (something)
           g(move(a));
   }

   void h()
   {
       X a;
       f(a);
   }

Separate translation units if you must. Challenge your own idea a
little bit; you'll see where this leads. Destruction without static
knowledge thereof is the ultimate violation of invariants.

-- 
Dave Abrahams
BoostPro Computing
http://www.boostpro.com

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk