Im C ++ 20-Standard wird gesagt, dass Array-Typen implizite Lebensdauertypen sind .
Bedeutet dies, dass ein Array für einen nicht impliziten Lebensdauertyp implizit erstellt werden kann? Die implizite Erstellung eines solchen Arrays würde nicht zur Erstellung der Elemente des Arrays führen.
Betrachten Sie diesen Fall:
//implicit creation of an array of std::string
//but not the std::string elements:
void * ptr = operator new(sizeof (std::string) * 10);
//use launder to get a "pointer to object" (which object?)
std::string * sptr = std::launder(static_cast<std::string*>(ptr));
//pointer arithmetic on not created array elements well defined?
new (sptr+1) std::string("second element");
Ist dieser Code seit C ++ 20 nicht mehr UB?
Vielleicht ist dieser Weg besser?
//implicit creation of an array of std::string
//but not the std::string elements:
void * ptr = operator new(sizeof (std::string) * 10);
//use launder to get a "pointer to the array of 10 std::string"
std::string (* sptr)[10] = std::launder(static_cast<std::string(*)[10]>(ptr));
//pointer arithmetic on an array is well defined
new (*sptr+1) std::string("second element");