On 07/22/2014 02:34 PM, Richard Biener wrote:
As discussed during the Cauldron keeping some builtin doesn't help because
you are not forced to access the newly created object via the pointer returned
by the placement new.  That is,

   template <T>
  struct Storage {
      char x[sizeof(T)];
     Storage() { new (x) T; }
     T& get() { return reinterpret_cast <T&> (x); }
};

is valid

Yes.

(and used in this way in Boost - with a type different from 'char'
to force bigger alignment).

But I don't think that should be valid, unless the type contains a char array at offset 0, as {std,boost}::aligned_storage; the C++ standard needs improvement in this area.

Looks like the small buffer optimization in boost::spirit::hold_any would need to be tweaked, as it uses a void* to store anything the same size or smaller, but that's the only dodgy case I see.

Jason

Reply via email to