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