Давайте возьмем пример в стандарте и немного его изменим:
#include <cstdlib>
struct X { int a, b; };
X *make_x() {
// The call to std::malloc implicitly creates an object of type X
// and its subobjects a and b, and returns a pointer to that X object
// (or an object that is pointer-interconvertible ([basic.compound]) with it),
// in order to give the subsequent class member access operations
// defined behavior.
X *p = (X*)std::malloc(sizeof(struct X) * 2); // me: added the *2
p->a = 1;
p->b = 2;
return p;
}
Раньше был только один набор допустимых объектов, которые можно было неявно создать в этом хранилище - он должен был быть точно один X
. Но теперь у нас есть память для двух X
с, но только запись в один из них, и ничто в этой программе никогда не затрагивает остальные байты. Таким образом, существует множество различных наборов объектов, которые могут быть созданы неявно - возможно, два X
с, может быть X
и два int
с, может быть X
и восемь char
с, ...
Нельзя наблюдать, какой набор создан, потому что, если бы были какие-либо реальные наблюдения, это уменьшило бы возможности только тех наборов, которые были действительны. Если мы сделали что-то вроде p[1]->a = 3
, то вселенная возможностей рухнет до одной с двумя X
s.
Другими словами, множественные наборы неявно созданных объектов возможны только тогда, когда в программе недостаточно наблюдений, чтобы отличить guish их достоверность. Если бы был способ отличить guish, то по определению они не были бы действительными.