Subject: Re: [boost] [config] RFC PR 82
From: Andrey Semashev (andrey.semashev_at_[hidden])
Date: 2015-11-25 10:46:56


On 2015-11-25 18:32, Alexander Lauser wrote:
>
>
> Am 25. November 2015 01:02:25 MEZ, schrieb Gavin Lambert
> <gavinl_at_[hidden]>:
>> 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.
>
> http://en.cppreference.com/w/cpp/language/union have an example that
> explicitly states what Gavin claimed. Not sure about the reliability
> of that site, though.

That sounds like self contradiction to me. The page says it's well
defined to examine the common subsequence of standard-layout union
members but at the same time it's UB to read from them. What's the
difference?