Array von nicht zusammenhängenden Objekten

#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) 

Was sind die Gründe für die Schwächungsstandardgarantien, sodass dieses Programm möglicherweise undefiniertes Verhalten aufweist?

Der Standard sagt: "Ein Objekt vom Typ Array enthält eine zusammenhängend zugewiesene nicht leere Menge von N Unterobjekten vom Typ T." [dcl.array] §8.3.4. Wenn Objekte vom Typ T keinen zusammenhängenden Speicher belegen, wie kann dann ein Array solcher Objekte vorgehen?

edit: entfernt möglicherweise ablenkenden erläuternden Text

Antworten auf die Frage(2)

Ihre Antwort auf die Frage