Created on 2020-11-07.00:00:00 last changed 35 months ago
Notes from the December, 2020 teleconference:
See also LWG issue 3495.
According to 17.6.5 [ptr.launder], referring to std::launder,
An invocation of this function may be used in a core constant expression whenever the value of its argument may be used in a core constant expression.
It is not clear whether this wording is intended to permit an example like
  #include <new>
  struct A { char x; };
  union U {
    A a;
    A a2;
  };
  constexpr A foo() {
    U u = {{42}};
    A *ap = &u.a2;
    return *std::launder(ap);
  }
  extern constexpr A globA = foo();
In particular, is the wording intended to restrict use of std::launder in a constant expression to cases in which the function returns its argument unchanged? As a further example, consider
  #include <new>
  struct A { char x; };
  struct B { A a; };
  struct BytesAndMore {
    unsigned char bytes[sizeof(A)];
    unsigned char more;
  };
  union U {
    BytesAndMore bytes;
    A a;
    B b;
  };
  constexpr B foo() {
    U u;
    A *ap = &u.a;
    B *bp = &u.b;
    u.bytes.more = 0;
    std::launder(ap)->x = 42;
    return *std::launder(bp);
  }
  extern constexpr B globB = foo();
		| History | |||
|---|---|---|---|
| Date | User | Action | Args | 
| 2022-11-20 07:54:16 | admin | set | status: open -> cd6 | 
| 2020-12-15 00:00:00 | admin | set | messages: + msg6285 | 
| 2020-11-07 00:00:00 | admin | create | |