#include <iostream>
#include <type_traits>
using namespace std;
// Non-trivially-copyable type.
struct NTC
{
int x;
NTC(int mX) : x(mX) { }
~NTC() { cout << "boop." << x << endl; }
};
int main()
{
using AS = aligned_storage_t<sizeof(NTC), alignof(NTC)>;
// Create two `std::aligned_storage` instances
// and "fill" them with two "placement-new-constructed"
// `NTC` instances.
AS as1, as2;
new (&as1) NTC{2};
new (&as2) NTC{5};
// Swap the `aligned_storages`, not their contents.
std::swap(as1, as2);
// Destroy the
NTC& in1{*static_cast<NTC*>(static_cast<void*>(&as1))};
NTC& in2{*static_cast<NTC*>(static_cast<void*>(&as2))};
in1.~NTC();
in2.~NTC();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+ICAgCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovLyBOb24tdHJpdmlhbGx5LWNvcHlhYmxlIHR5cGUuCnN0cnVjdCBOVEMKewoJaW50IHg7ICAgIAkKCU5UQyhpbnQgbVgpIDogeChtWCkgeyB9ICAgIAoJfk5UQygpIHsgY291dCA8PCAiYm9vcC4iIDw8IHggPDwgZW5kbDsgfQp9OwogICAgICAgIAppbnQgbWFpbigpIAp7Cgl1c2luZyBBUyA9IGFsaWduZWRfc3RvcmFnZV90PHNpemVvZihOVEMpLCBhbGlnbm9mKE5UQyk+OwogCQogICAgLy8gQ3JlYXRlIHR3byBgc3RkOjphbGlnbmVkX3N0b3JhZ2VgIGluc3RhbmNlcwogICAgLy8gYW5kICJmaWxsIiB0aGVtIHdpdGggdHdvICJwbGFjZW1lbnQtbmV3LWNvbnN0cnVjdGVkIiAKICAgIC8vIGBOVENgIGluc3RhbmNlcy4KCUFTIGFzMSwgYXMyOyAgICAJCgluZXcgKCZhczEpIE5UQ3syfTsKCW5ldyAoJmFzMikgTlRDezV9OwoJICAgIAkgICAgCiAgICAvLyBTd2FwIHRoZSBgYWxpZ25lZF9zdG9yYWdlc2AsIG5vdCB0aGVpciBjb250ZW50cy4KCXN0ZDo6c3dhcChhczEsIGFzMik7CiAgICAKICAgIC8vIERlc3Ryb3kgdGhlIAogICAgTlRDJiBpbjF7KnN0YXRpY19jYXN0PE5UQyo+KHN0YXRpY19jYXN0PHZvaWQqPigmYXMxKSl9OwoJTlRDJiBpbjJ7KnN0YXRpY19jYXN0PE5UQyo+KHN0YXRpY19jYXN0PHZvaWQqPigmYXMyKSl9OyAgICAJCglpbjEufk5UQygpOwoJaW4yLn5OVEMoKTsKCQoJcmV0dXJuIDA7Cn0=