Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • Home
  • SEARCH
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 8423041
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 10, 20262026-06-10T03:37:30+00:00 2026-06-10T03:37:30+00:00

I was under the impression that accessing a union member other than the last

  • 0

I was under the impression that accessing a union member other than the last one set is UB, but I can’t seem to find a solid reference (other than answers claiming it’s UB but without any support from the standard).

So, is it undefined behavior?

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-10T03:37:32+00:00Added an answer on June 10, 2026 at 3:37 am

    The confusion is that C explicitly permits type-punning through a union, whereas C++ (c++11) has no such permission.

    c11

    6.5.2.3 Structure and union members

    95) If the member used to read the contents of a union object is not the same as the member last used to
    store a value in the object, the appropriate part of the object representation of the value is reinterpreted
    as an object representation in the new type as described in 6.2.6 (a process sometimes called ‘‘type
    punning’’). This might be a trap representation.

    The situation with C++:

    c++11

    9.5 Unions [class.union]

    In a union, at most one of the non-static data members can be active at any time, that is, the value of at
    most one of the non-static data members can be stored in a union at any time.

    C++ later has language permitting the use of unions containing structs with common initial sequences; this doesn’t however permit type-punning.

    To determine whether union type-punning is allowed in C++, we have to search further. Recall that c99 is a normative reference for C++11 (and C99 has similar language to C11 permitting union type-punning):

    3.9 Types [basic.types]

    4 – The object representation of an object of type T is the sequence of N unsigned char objects taken up by
    the object of type T, where N equals sizeof(T). The value representation of an object is the set of bits that
    hold the value of type T. For trivially copyable types, the value representation is a set of bits in the object
    representation that determines a value, which is one discrete element of an implementation-defined set of
    values. 42
    42) The intent is that the memory model of C++ is compatible with that of ISO/IEC 9899 Programming Language C.

    It gets particularly interesting when we read

    3.8 Object lifetime [basic.life]

    The lifetime of an object of type T begins when:
    — storage with the proper alignment and size for type T is obtained, and
    — if the object has non-trivial initialization, its initialization is complete.

    So for a primitive type (which ipso facto has trivial initialization) contained in a union, the lifetime of the object encompasses at least the lifetime of the union itself. This allows us to invoke

    3.9.2 Compound types [basic.compound]

    If an object of type T is located at an address A, a pointer of type cv T* whose value is the
    address A is said to point to that object, regardless of how the value was obtained.

    Assuming that the operation we are interested in is type-punning i.e. taking the value of a non-active union member, and given per the above that we have a valid reference to the object referred to by that member, that operation is lvalue-to-rvalue conversion:

    4.1 Lvalue-to-rvalue conversion [conv.lval]

    A glvalue of a non-function, non-array type T can be converted to a prvalue.
    If T is an incomplete type, a program that necessitates this conversion is ill-formed. If the object to which the glvalue refers is not an object of type T and is not an object of a type derived from T, or if the object is uninitialized, a program that necessitates this conversion has undefined behavior.

    The question then is whether an object that is a non-active union member is initialized by storage to the active union member. As far as I can tell, this is not the case and so although if:

    • a union is copied into char array storage and back (3.9:2), or
    • a union is bytewise copied to another union of the same type (3.9:3), or
    • a union is accessed across language boundaries by a program element conforming to ISO/IEC 9899 (so far as that is defined) (3.9:4 note 42), then

    the access to a union by a non-active member is defined and is defined to follow the object and value representation, access without one of the above interpositions is undefined behaviour. This has implications for the optimisations allowed to be performed on such a program, as the implementation may of course assume that undefined behaviour does not occur.

    That is, although we can legitimately form an lvalue to a non-active union member (which is why assigning to a non-active member without construction is ok) it is considered to be uninitialized.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I was under the impression that webm played on Android, but I can't get
I was under the impression that this was formed correctly, but here it is
I was under the impression that QueryPerformanceCounter was actually accessing the counter that feeds
I was under the impression that any function in C would support only one
I was under the impression that these days javascript can be used as a
I was under the impression that I could run it on any machine, but
I was under the impression that with key-value coding, I could set any undefined
I was under the impression that argument-less functions can be called with empty parentheses
I was under the impression that when we send mail to any domain (i.e.
I'm under the impression that a control in a nested UpdatePanel will cause the

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.