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");
Antworten:
Ja.
Ja.
Dies macht die
std::vector
Implementierung in normalem C ++ möglich.quelle
std::launder(static_cast<std::string*>(ptr))
kein Zeiger auf das erste Element des Arrays zurückgegeben wird, weil es sich nicht innerhalb seiner Lebensdauer befindet, sondern dassstd::launder(static_cast<std::string(*)[10]>(ptr))
ein Zeiger auf das Array zurückgegeben wird, weil sich das Array innerhalb seiner Lebensdauer befindet?std::launder
wird eigentlich nicht benötigt, weil eel.is/c++draft/intro.object#11 garantiert, dassptr
es bereits auf das Array verweist ?static_cast
tostd::string (*) [10]
sollte also ausreichen! tx.std::launder
gut definiert sein wird. Es gibt keinstd::string
Objekt, auf das gezeigt werden kann, das jedochptr
auf das Array verweisen könnte, sodass die statische Umwandlung den Wert unverändert lässt undsptr
auch auf das Array zeigt. Damitstd::launder
ist UB einfach wegen derstd::launder
Anforderungen.