#include <iostream>
#include <new>
#include <memory>
#include <type_traits>
using namespace std;
struct PointerHolder {
PointerHolder(const void * p) {
cout << "Constructed Holder @ " << this << " with p == " << p << endl;
}
void * operator new(size_t, void * pp) { return pp; }
const void * ptr{};
};
int main() {
int z{};
cout << "&z == " << &z << endl;
PointerHolder p1(&z);
auto buf = aligned_storage_t<sizeof(PointerHolder), alignof(PointerHolder)>{};
auto p2 = ::new (&buf) PointerHolder(&z);
// This doesn't compile
// auto p3 = make_unique<PointerHolder>(&z);
// And neither does this
// auto p4 = new PointerHolder(&z);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bmV3PgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgUG9pbnRlckhvbGRlciB7CglQb2ludGVySG9sZGVyKGNvbnN0IHZvaWQgKiBwKSB7CgkJY291dCA8PCAiQ29uc3RydWN0ZWQgSG9sZGVyIEAgIiA8PCB0aGlzIDw8ICIgd2l0aCBwID09ICIgPDwgcCA8PCBlbmRsOwoJfQoJCgl2b2lkICogb3BlcmF0b3IgbmV3KHNpemVfdCwgdm9pZCAqIHBwKSB7IHJldHVybiBwcDsgfQoJY29uc3Qgdm9pZCAqIHB0cnt9Owp9OwoKaW50IG1haW4oKSB7CglpbnQgent9OwoJY291dCA8PCAiJnogPT0gIiA8PCAmeiA8PCBlbmRsOwoJCglQb2ludGVySG9sZGVyIHAxKCZ6KTsKCQoJYXV0byBidWYgPSBhbGlnbmVkX3N0b3JhZ2VfdDxzaXplb2YoUG9pbnRlckhvbGRlciksIGFsaWdub2YoUG9pbnRlckhvbGRlcik+e307CglhdXRvIHAyID0gOjpuZXcgKCZidWYpIFBvaW50ZXJIb2xkZXIoJnopOwoJCgkvLyBUaGlzIGRvZXNuJ3QgY29tcGlsZQoJLy8gYXV0byBwMyA9IG1ha2VfdW5pcXVlPFBvaW50ZXJIb2xkZXI+KCZ6KTsKCQoJLy8gQW5kIG5laXRoZXIgZG9lcyB0aGlzCgkvLyBhdXRvIHA0ID0gbmV3IFBvaW50ZXJIb2xkZXIoJnopOwoJcmV0dXJuIDA7Cn0=