Поскольку стандарт намеренно воздерживается от требования, чтобы все реализации были пригодны для всех целей, часто для качественных реализаций, предназначенных для различных целей, часто требуется гарантировать поведение кода, к которому сам стандарт не предъявляет никаких требований.
Если некоторый тип T
поддерживает создание неявных объектов и программа преобразует адрес некоторого объекта в T*
, высококачественная реализация, предназначенная для поддержки концепций низкоуровневого программирования без использования специального синтаксиса, будет вести себя как хотя такое преобразование создает объект типа T
в тех случаях, когда это позволило бы программе иметь определенное поведение, но не могло бы неявно создавать такие объекты, в случаях, когда это не было бы необходимо, но вместо этого приводило бы к неопределенному поведению путем уничтожения других объекты.
Таким образом, если float
и uint32_t
имеют одинаковый размер и имеют одинаковые требования к выравниванию, то, например,
alignas(uint32_t) char obj[sizeof(uint32_t)];
float *fp = (float*)obj;
*fp = 1.0f;
uint32_t *up = (uint32_t*)obj;
Инициализация fp
создаст float
, потому что это потребуется для выполнения назначения *fp
. Если up
будет использоваться таким образом, что для его существования требуется uint32_t
, присвоение up
может создать его при уничтожении float
, который был там. Если up
не используется таким образом, но fp
используется таким образом, что требуется, чтобы float
все еще существовал, то float
все еще существовал бы. Если оба указателя используются способами, которые потребуют, чтобы соответствующие объекты все еще существовали, даже качественный компилятор, предназначенный для низкоуровневого программирования, мог бы не справиться с такой возможностью.
Обратите внимание, что реализации, которые не особенно подходят для низкоуровневого программирования, могут не поддерживать семантику, описанную здесь. Авторы Стандарта позволяют авторам компиляторов поддерживать такую семантику или нет, основываясь на том, необходимы ли они для предполагаемых целей их компиляторов; к сожалению, пока нет никакого стандартного способа отличить компиляторы, которые подходят для таких целей, от тех, которые не подходят.