From: Andrey Semashev (andrey.semashev_at_[hidden])
Date: 2022-02-18 15:55:04


On 2/18/22 18:15, Andrea Bocci wrote:
> Hi Andrey,
> now I'm curious... is
>
>   alignas(int) unsigned char storage[sizeof(int)];
>   int* p1 = new (storage) int(1);
>   int* p3 = new (storage) int(3);
>   std::printf("%d\n", *p1);
>
> different from
>
>     int* p1 = new int(1);
>     int* p3 = new (p1) int(3);
>     std::printf("%d\n", *p1);
>
> or even
>
>     int p1 = 1;
>     int* p3 = new (&p1) int(3);
>     std::printf("%d\n", p1);
>
> ?

In the examples above, you're reusing storage of the object with a
different object of the same type, that is the old object is
"transparently replaceable" by the new one. See here:

https://en.cppreference.com/w/cpp/language/lifetime#Storage_reuse

In this case, p1 remains valid and can be used to access the new object.