Цитируя N4140 (примерно 14 C++):
3.9 Типы [basic.types]
2 Для любого объекта (кроме базового класса подобъекта) из тривиальных копируемых тип T
, независимо от того, имеет ли объект допустимое значение типа T
, базовые байты (1.7), составляющие объект, могут быть скопированы в массив из char
или unsigned char
. Если содержимое массива char
или unsigned char
будет скопировано обратно в объект, объект впоследствии сохранит свое первоначальное значение.
42) Используя, например, библиотечные функции (17.6.1.2) std::memcpy
или std::memmove
.
3 Для любого тривиальным Copyable типа T
, если два указатели на T
указывают на различных T
объектов obj1
и obj2
, где ни obj1
, ни obj2
представляет собой базовый класс подобъектом, если основные байт (1.7), составляющие obj1
копируются до obj2
, obj2
в дальнейшем будет содержать то же значение, что и obj1
. [Пример: ...]
43) с использованием, например, функции библиотеки (17.6.1.2) std::memcpy
или std::memmove
.
Это, в принципе, позволяют назначение непосредственно s[2]
если вы занять позицию, что назначение s[2]
косвенно обязаны быть эквивалентна копированию всех какой-то другой Blob
в массив, который как раз случается быть побайтно идентичны, за исключением для третьего байта, и скопируйте его в Blob
: вы не назначаете s[0]
, s[1]
и т. д. Для тривиально копируемых типов, включая char
, что эквивалентно их точному значению, которое также не имеет наблюдаемых эффект.
Однако, если единственный способ получить s[2] == 'A'
является манипуляцией памяти, то допустимый аргумент также может быть то, что вы копируете обратно в Blob
это не основные байты, которые составляли все предыдущие Blob
, В этом случае технически поведение будет неопределенным бездействия.
Я действительно подозреваю, особенно с учетом того, «имеет ли объект допустимое значение типа T
», что он предназначен для разрешения.
Это было бы даже не скомпилировано без броска. – dgross
Это C? В C++ это не будет компилироваться. – Bathsheba
Это не законный C или C++, вам нужен актерский состав. Когда у вас есть актерский состав, это законно и четко определено. Конечно, все может случиться, если вы попытаетесь получить доступ к blob.x впоследствии. –