Boost logo

Boost :

Subject: Re: [boost] [config] RFC PR 82
From: Gavin Lambert (gavinl_at_[hidden])
Date: 2015-11-24 19:02:25


On 25/11/2015 10:03, Andrey Semashev wrote:
> On 2015-11-24 23:54, Agustín K-ballo Bergé wrote:
>> On 11/24/2015 5:20 PM, Andrey Semashev wrote:
>>>>> Ditto BOOST_HAS_UNION_TYPE_PUNNING_TRICK (doesn't any compiler support
>>>>> this?).
>>>>
>>>> 'I'm all with you on this one' but since 'it is not in the standard'
>>>> language purists will probably complain if it is used
>>>> unconditionally...
>>>
>>> To some extent this is guaranteed by [class.union]/1 in C++11.
>>
>> No, it isn't.
>
> Why? Reading different members of the standard layout union within the
> common initial sequence is enough to implement a bitwise_cast.

I don't have a standard reference handy, but I'm pretty sure that
reading from a different member of a union than was written to is still
explicitly UB -- although for practical reasons *most* compilers will
generate the expected result provided that the two types have the same
initial alignment.

The only officially supported way to type-pun AFAIK is to cast via byte
sequences (aka uint8_t * and friends), and even that can get you in
trouble (on some platforms) if the alignments don't match.


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