Matriz de objetos no contiguos.

#include <iostream> 
#include <cstring>
// This struct is not guaranteed to occupy contiguous storage
// in the sense of the C++ Object model (§1.8.5):
struct separated { 
  int i; 
  separated(int a, int b){i=a; i2=b;} 
  ~separated(){i=i2=-1;} // nontrivial destructor --> not trivially   copyable
  private: int i2;       // different access control --> not standard layout
};
int main() {
  static_assert(not std::is_standard_layout<separated>::value,"sl");
  static_assert(not std::is_trivial<separated>::value,"tr");
  separated a[2]={{1,2},{3,4}};
  std::memset(&a[0],0,sizeof(a[0]));
  std::cout<<a[1].i;    
  // No guarantee that the previous line outputs 3.
}
// compiled with Debian clang version 3.5.0-10, C++14-standard 
// (outputs 3) 

¿Cuál es la razón de debilitar las garantías estándar hasta el punto de que este programa puede mostrar un comportamiento indefinido?

El estándar dice: "Un objeto de tipo matriz contiene un conjunto contiguo no vacío de N subobjetos de tipo T." [dcl.array] §8.3.4. Si los objetos de tipo T no ocupan almacenamiento contiguo, ¿cómo puede hacerlo una matriz de tales objetos?

editar: eliminado texto explicativo posiblemente distractor

Respuestas a la pregunta(1)

Su respuesta a la pregunta