#include <iostream>
#include <string>
using namespace std;
union U {
string s;
int i;
U (string s) : s(s) { cout << "s is active"<<endl;}
U (int i) : i(i) { cout << "i is active"<<endl;}
U() : s() { cout << "s is active by default" <<endl; }
~U() { cout << "delete... but what ?"<<endl; }
};
int main() {
U u("hello");
u.s += ", world";
cout << u.s <<endl;
u.s.~string(); // properly end the life of s
u.i=0; // this is now the active member
// no need to end life of an int, as it has a trivial destructor
new (&u.s) string("goodbye"); // placement new
cout << u.s <<endl;
u.s.~string(); // because our destructor doesn't know what's active
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdW5pb24gVSB7CglzdHJpbmcgczsKCWludCBpOwoJVSAoc3RyaW5nIHMpIDogcyhzKSB7IGNvdXQgPDwgInMgaXMgYWN0aXZlIjw8ZW5kbDt9CglVIChpbnQgaSkgOiBpKGkpIHsgY291dCA8PCAiaSBpcyBhY3RpdmUiPDxlbmRsO30KCVUoKSA6IHMoKSB7IGNvdXQgPDwgInMgaXMgYWN0aXZlIGJ5IGRlZmF1bHQiIDw8ZW5kbDsgfQoJflUoKSB7IGNvdXQgPDwgImRlbGV0ZS4uLiBidXQgd2hhdCA/Ijw8ZW5kbDsgfQp9OwoKaW50IG1haW4oKSB7CglVIHUoImhlbGxvIik7IAoJdS5zICs9ICIsIHdvcmxkIjsgIAoJY291dCA8PCB1LnMgPDxlbmRsOwoJCgl1LnMufnN0cmluZygpOyAvLyBwcm9wZXJseSBlbmQgdGhlIGxpZmUgb2YgcwoJdS5pPTA7CS8vIHRoaXMgaXMgbm93IHRoZSBhY3RpdmUgbWVtYmVyICAgCgkgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gZW5kIGxpZmUgb2YgYW4gaW50LCBhcyBpdCBoYXMgYSB0cml2aWFsIGRlc3RydWN0b3IgCgluZXcgKCZ1LnMpIHN0cmluZygiZ29vZGJ5ZSIpOyAgLy8gcGxhY2VtZW50IG5ldyAgCgljb3V0IDw8IHUucyA8PGVuZGw7ICAgIAoJdS5zLn5zdHJpbmcoKTsgLy8gYmVjYXVzZSBvdXIgZGVzdHJ1Y3RvciBkb2Vzbid0IGtub3cgd2hhdCdzIGFjdGl2ZQoJCglyZXR1cm4gMDsKfQ==