代码
#include <new>
#include <cstddef>
#include <cassert>
#include <iostream>
struct X {
const int n;
int m;
};
struct Y {
int z;
};
struct A {
virtual int transmogrify();
};
struct B : A {
int transmogrify() override { new(this) A; return 2; }
};
int A::transmogrify() { new(this) B; return 1; }
static_assert(sizeof(B) == sizeof(A));
int main()
{
X* p = new X{ 3, 4 };
std::cout << "p->m:" << p->m << ", p->n:" << p->n << "\n";
const int a = p->n;
std::cout << "a:" << a << "\n";
X* np = new (p) X{ 5, 6 };
std::cout << "p->m:" << p->m << ", p->n:" << p->n << "\n";
std::cout << "np->m:" << np->m << ", np->n:" << np->n << "\n";
const int b = p->n;
const int c = p->m;
std::cout << "b:" << b << "\n";
std::cout << "c:" << c << "\n";
const int d = std::launder(p)->n;
std::cout << "d:" << d << "\n";
const int e = np->n;
std::cout << "e:" << e << "\n";
A i;
int n = i.transmogrify();
std::cout << "n:" << n << "\n";
int m = std::launder(&i)->transmogrify();
std::cout << "m:" << m << "\n";
assert(m + n == 3);
alignas(Y) std::byte s[sizeof(Y)];
Y* q = new(&s) Y{ 2 };
const int f = reinterpret_cast<Y*>(&s)->z;
std::cout << "f:" << f << "\n";
const int g = q->z;
const int h = std::launder(reinterpret_cast<Y*>(&s))->z;
std::cout << "g:" << g << "\n";
std::cout << "h:" << h << "\n";
return 0;
}