Разрешается ли арифметика указателя c на выделенном хранилище начиная с C ++ 20? - PullRequest
10 голосов
/ 11 марта 2020

В стандарте 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 Ответ

3 голосов
/ 11 марта 2020

Означает ли это, что массив неявного типа времени жизни может быть создан неявно?

Да.

Неявное создание такого массива не приведет к созданию элементов массива?

Да.

Это то, что делает std::vector реализуемым в обычном C ++.

...