Created on 2020-11-07.00:00:00 last changed 37 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 | |