#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 ( & buf) PointerHolder( & z) ;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bmV3PgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgUG9pbnRlckhvbGRlciB7CglQb2ludGVySG9sZGVyKGNvbnN0IHZvaWQgKiBwKSB7CgkJY291dCA8PCAiQ29uc3RydWN0ZWQgSG9sZGVyIEAgIiA8PCB0aGlzIDw8ICIgd2l0aCBwID09ICIgPDwgcCA8PCBlbmRsOwoJfQoJCgl2b2lkICogb3BlcmF0b3IgbmV3KHNpemVfdCwgdm9pZCAqIHBwKSB7IHJldHVybiBwcDsgfQoJY29uc3Qgdm9pZCAqIHB0cnt9Owp9OwoKaW50IG1haW4oKSB7CglpbnQgent9OwoJY291dCA8PCAiJnogPT0gIiA8PCAmeiA8PCBlbmRsOwoJCglQb2ludGVySG9sZGVyIHAxKCZ6KTsKCQoJYXV0byBidWYgPSBhbGlnbmVkX3N0b3JhZ2VfdDxzaXplb2YoUG9pbnRlckhvbGRlciksIGFsaWdub2YoUG9pbnRlckhvbGRlcik+e307CglhdXRvIHAyID0gOjpuZXcgKCZidWYpIFBvaW50ZXJIb2xkZXIoJnopOwoJCgkvLyBUaGlzIGRvZXNuJ3QgY29tcGlsZQoJLy8gYXV0byBwMyA9IG1ha2VfdW5pcXVlPFBvaW50ZXJIb2xkZXI+KCZ6KTsKCQoJLy8gQW5kIG5laXRoZXIgZG9lcyB0aGlzCglhdXRvIHA0ID0gbmV3ICgmYnVmKSBQb2ludGVySG9sZGVyKCZ6KTsKCXJldHVybiAwOwp9