У стандарті C ++ 20 сказано, що типи масивів - це неявний тип життя .
Чи означає це, що масив до неявного типу життя може бути неявно створений? Неявне створення такого масиву не спричинило б створення елементів масиву?
Розглянемо цей випадок:
//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");
Цей код вже не є UB, оскільки C ++ 20?
Може, цей спосіб краще?
//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");
1
Я щойно здійснив пошук за (чернетки) стандартом C ++ 20, і не знайшов нічого, що описує масиви як "неявний тип життя" (і, так, я шукав варіанти). Будь ласка, надайте більш детальний опис вашої претензії (наприклад, розділ та пункт у стандарті). Трохи важко відповісти на ваше запитання, не маючи змоги знайти джерело, не кажучи вже про будь-який відповідний контекст.
—
Петро
@Peter: eel.is/c++draft/basic.types#9 , останнє речення
—
geza
Я переглядав PDF open-std.org/jtc1/sc22/wg21/docs/papers/2020/n4849.pdf (нібито останній робочий проект), і він навіть не має такого речення. Схоже, вам також знадобиться знайти значення "неявна життя". Я підозрюю, що ваше посилання, можливо, вибрало деякі "редагування в процесі роботи", які навіть не перетворили його на робочі чернетки.
—
Петро
@Peter Зміни є результатом того, що P0593 було об'єднано у стандарт із недавньої зустрічі в Празі. Вони ще не випустили отриману чернетку, але ви можете побачити об'єднане формулювання в цьому комітеті .
—
волоський горіх