
On Fri, May 15, 2009 at 9:11 PM, Fernando Cacciola <fernando.cacciola@gmail.com> wrote: [ the following text was by me] z>>
IIRC aliasing rules talk about dynamic types of objects: roughly, you can access a memory location only with a type which is the same as the *dynamic type* of that location or as a char array.
Boost optional does an explicit placement new of the stored type on the buffer
Via a char*, so the placement new is merely taking the address of a suitably aligned memory b'lock.
which changes the dynamic type of the buffer
Just for the record, no it doesn't.
Wait, how it doesn't? It uses placement new. The lifetime of an object, and thus its type begins at the new expression and ends when deleted. Initially the buffer of an optional<T> certainly hasn't type T (in fact, being an union, the type would be undetermined until the first store to a member of the union), but when placement new T is used and the object is constructed, the buffer certainly has type T. As the type is a property of the object, when the object is deleted, the buffer certainly no longer has that type. So I think you can say that, in optional at least, placement new changes the type of the buffer, from undetermined to T. Am I missing something? -- gpd