Date: Fri, 26 Feb 2016 12:12:45 +0000
I apologize in advance if this was discussed before; I didn't check the entire archive. Consider
static_assert(alignof(float) >= alignof(int) && sizeof(float) >= sizeof(int));
int foo(float f) {
return *std::launder(reinterpret_cast<int*>(&f)); }
As it stands, invocation of foo is undefined, as the argument to launder is not pointing to an object of type int (or similar) within its lifetime,
violating launder's requirement.
launder is designed to inhibit address propagation analysis, which is the only concerning optimization. Moreover, as long as all usual conditions are
met (alignment, size & trap values), this should be fine on any implementation. If so, can we make the above formally well-defined?
Being able to use launder in such scenarios would render circumlocutions via memcpy superfluous.
Robert
static_assert(alignof(float) >= alignof(int) && sizeof(float) >= sizeof(int));
int foo(float f) {
return *std::launder(reinterpret_cast<int*>(&f)); }
As it stands, invocation of foo is undefined, as the argument to launder is not pointing to an object of type int (or similar) within its lifetime,
violating launder's requirement.
launder is designed to inhibit address propagation analysis, which is the only concerning optimization. Moreover, as long as all usual conditions are
met (alignment, size & trap values), this should be fine on any implementation. If so, can we make the above formally well-defined?
Being able to use launder in such scenarios would render circumlocutions via memcpy superfluous.
Robert
Received on 2016-02-26 13:34:04