Quote from N4140 (approximately C ++ 14):
3.9 Types [basic.types]
2 For any object (except a subobject of the base class) of a trivially copied type T , regardless of whether the object has a valid value of type T , the basic bytes (1.7) that make up the object can be copied to an array from char or unsigned char . 42 If the contents of a char or unsigned char array are copied back to the object, the object subsequently saves its original value.
42) Using, for example, the library functions (17.6.1.2) std::memcpy or std::memmove .
3 For any trivially copied type T , if two pointers to T point to different T objects obj1 and obj2 , where neither obj1 nor obj2 is a subobject of the base class, if the base bytes (1.7) that make up obj1 in obj2 , 43 obj2 subsequently it will have the same meaning as obj1 . [Example:...]
43) Using, for example, the library functions (17.6.1.2) std::memcpy or std::memmove .
This allows you, in principle, to allow the assignment directly to s[2] if you are in a position for which the indirect assignment of s[2] should be equivalent to copying all the other Blob to an array, which simply turns out to be identical by default, except for the third byte, and copying it into your Blob : you don't assign s[0] , s[1] , etc. For trivially copied types, including char , this is equivalent to setting them to the exact value that they already have, which also has no observable effect.
However, if the only way to get s[2] == 'A' is with memory manipulation, then there may also be a valid argument that what you copy back to your Blob is not the base bytes that made up any previous Blob . In this case, technically the behavior will be undefined inaction.
I strongly suspect, especially considering "does the object have a valid value of type T " a comment that it was supposed to allow.