Citando N4140 (circa C++ 14):
3.9 Tipi [basic.types]
2 Per qualsiasi oggetto (diverso da un sotto-oggetto classe base) di banalmente copiabile digitare T
, se l'oggetto contiene o meno un valore valido di tipo T
, i byte sottostanti (1.7) che costituiscono l'oggetto possono essere copiati in un array di char
o unsigned char
. Se il contenuto dell'array di char
o unsigned char
viene copiato nell'oggetto, l'oggetto deve successivamente conservare il suo valore originale.
42) Utilizzando, ad esempio, le funzioni di libreria (17.6.1.2) std::memcpy
o std::memmove
.
3 Per qualsiasi tipo banalmente copiabile T
, se due puntatori a T
punto a distinte T
oggetti obj1
e obj2
, dove né obj1
né obj2
è un sotto-oggetto classe base, se si copiano i byte sottostanti (1.7) che compongono obj1
in obj2
, obj2
deve successivamente contenere lo stesso valore di obj1
. [Esempio: ...]
43) Utilizzando, ad esempio, le funzioni di libreria (17.6.1.2) std::memcpy
o std::memmove
.
Ciò, in linea di principio, consentono assegnazione direttamente s[2]
se si prende il che una cessione ad s[2]
è indirettamente richiesto di essere equivalente a copiando tutti qualche altro Blob
in una matrice che avviene solo per essere a byte identici tranne per il terzo byte, e copiandolo nel tuo Blob
: non stai assegnando a s[0]
, s[1]
, ecc. Per i tipi banalmente copiabili incluso char
, equivale a impostarli sul valore esatto che hanno già, che inoltre non ha alcun osservabile effetto.
Tuttavia, se l'unico modo per ottenere s[2] == 'A'
è di manipolazione della memoria, quindi un argomento valido potrebbe essere fatta anche che quello che stai copiando di nuovo nella vostra Blob
non è i byte sottostanti che componevano qualsiasi precedente Blob
. In tal caso, tecnicamente, il comportamento non sarebbe definito dall'omissione.
Sospetto fortemente, in particolare dato "se l'oggetto contiene o meno un valore valido di tipo T
" commento, che è previsto che sia consentito.
Questo non sarebbe nemmeno compilato senza un cast però. – dgross
È questo C? In C++ questo non verrà compilato. – Bathsheba
Questo non è legale C o C++, è necessario un cast. Una volta che hai un cast, questo è legale e ben definito. Ovviamente tutto può succedere se si tenta di accedere a blob.x in seguito. –