C++ Logo

std-discussion

Advanced search

Re: UB, unions, common initial sequence and constexpr

From: Wilhelm Meier <wilhelm.meier_at_[hidden]>
Date: Fri, 21 Oct 2022 15:21:58 +0200
On 21.10.22 15:00, Lénárd Szolnoki via Std-Discussion wrote:
> Hi,
>
> It's explicitly not allowed in constexpr:

Yes. But I wonder if there the exception of structs with common initials
sequence ist just "forgotten"?

If this exception

https://timsong-cpp.github.io/cppwp/class.union#general-2

is given, why should that not hold in a constexpr context?

--
Wilhelm
> 
> https://timsong-cpp.github.io/cppwp/n4868/expr.const#5.9 
> <https://timsong-cpp.github.io/cppwp/n4868/expr.const#5.9>
> 
> Cheers,
> Lénárd
> 
> 
> On 21 October 2022 12:36:57 BST, Wilhelm Meier via Std-Discussion 
> <std-discussion_at_[hidden]> wrote:
> 
>     HI all,
> 
>     the standard explicitly makes this exception: accessing an inactive union member is not UB if the members are structs with initial common sequence.
> 
>     Is this also true in a constexpr context? I ask this because the chapter for constexpr expression does not mention this exception accessing an inactive memeber.
> 
>     Here is some test-code:
> 
>     struct A {
>          char e0;
>     };
>     struct B {
>          char e0;
>     };
> 
>     template<typename A, typename B>
>     union U {
>          A a;
>          B b;
>     };
> 
>     int main() {
>          constexpr U<A, B> u{.a = {1}}; // sets member a active
>          constexpr char t1 = u.b.e0; // should be ok, because read via a struct with common initial sequence, but also in a constexpr context?
>     }
>     -- 
>     Wilhelm
> 
> 

Received on 2022-10-21 13:22:01