Dans la norme C ++ 20, il est dit que les types de tableau sont de type implicite à vie .
Cela signifie-t-il qu'un tableau d'un type de durée de vie non implicite peut être créé implicitement? La création implicite d'un tel tableau ne provoquerait pas la création des éléments du tableau?
Considérez ce cas:
//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");
Ce code n'est-il plus UB depuis C ++ 20?
Peut-être que c'est mieux ainsi?
//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");