On 07/05/2017 01:26 PM, Geza Herman wrote:
On 07/05/2017 01:14 PM, Jonathan Wakely wrote:
I think the reason it's not optimized away is for this case:
void somefunction(const Object& object);
{
void* p = &object;
object.~Object();
new(p) Object();
}
This means that after calling someFunction there could be a different
object at the same location (with a possibly different value for that
member).
https://stackoverflow.com/questions/39382501/what-is-the-purpose-of-stdlaunder
I don't know whether the anwser at stackoverflow is right, but: the
compiler can assume that m_initType doesn't change, if I don't launder
it. (in this case, though, I don't know how would I tell the compiler
that it must call the destructor "laundered".)
Have a look at this doc:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0532r0.pdf
It explitly says that after "new(p) Object();", it is UB to access
object (even the mutable members!) via p. If you want to access it, you
have to use the pointer which "new" returned. Or, std::launder must be
used (c++17 proposal).