This is an unofficial snapshot of the ISO/IEC JTC1 SC22 WG21 Core Issues List revision 115b. See http://www.open-std.org/jtc1/sc22/wg21/ for the official list.
2024-08-20
According to 6.7.2 [intro.object] paragraph 3,
If a complete object is created (7.6.2.8 [expr.new]) in storage associated with another object e of type “array of N unsigned char” or of type “array of N std::byte” (17.2.1 [cstddef.syn]), that array provides storage for the created object if:
the lifetime of e has begun and not ended, and
the storage for the new object fits entirely within e, and
there is no smaller array object that satisfies these constraints.
The intent of the third bullet is to select a unique array object among those satisfying the first two bullets. However, it is possible to have multiple array objects of the same size satisfying the first two bullets. For example:
unsigned char buffer[8]; struct OhNo { std::byte data[8]; }; static_assert(sizeof(OhNo) == 8 && sizeof(int) == 4); OhNo *p = new (buffer) OhNo; // buffer provides storage for OhNo int *q = new (p->data) int; // who provides storage for this? int *r = new (buffer + 4) int; // who provides storage for this?
Suggested resolution:
Change 6.7.2 [intro.object] bullet 3.3 as follows:
there is no smaller
array object that satisfies these
constraints nested within e.
Proposed resolution (February, 2021):
Change 6.7.2 [intro.object] bullet 3.3 as follows:
there is no smaller
array object that satisfies these
constraints nested within e.