Nello standard C ++ 20, si dice che i tipi di array sono il tipo di durata implicita .
Significa che un array per un tipo di vita non implicito può essere creato in modo implicito? La creazione implicita di un tale array non provocherebbe la creazione degli elementi dell'array?
Considera questo caso:
//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");
Questo codice non è più UB dal C ++ 20?
Forse in questo modo è meglio?
//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");