Std::construct_at и время жизни объекта?C++

Программы на C++. Форум разработчиков
Anonymous
 Std::construct_at и время жизни объекта?

Сообщение Anonymous »

Я просматривал код, который я предложил для инициализации std::array во время компиляции для объектов, не создаваемых по умолчанию: https://stackoverflow.com/a/78676552/21691539
во второй версии делаю:

Код: Выделить всё

// creating storage on std::byte to benefit from "implicit object creation"
alignas(alignof(T)) std::byte storage[sizeof(std::array)];
std::array* const Array =
std::launder(reinterpret_cast(storage));

// initializing objects in the storage
T* it =
Array->data();  // construct objects in storage through std::construct_at
for (std::size_t i = 0; i != N; ++i) {
std::construct_at(it, gen(static_cast(i))); // UB?
// new (it) T(gen(static_cast(i))); // not UB?
++it;
}
LIVE
Я хотел полагаться на тот факт, что std::array — это неявный тип времени жизни, но я думаю сейчас что я UB по следующей причине: Array действительно начал свое существование, но ни один из его подобъектов типа T:

Некоторые операции описываются как неявное создание объектов в указанной области хранения.[...] [Примечание: такие операции не запускают время жизни подобъектов таких объектов, которые сами не относятся к типам неявного времени жизни. — конечная заметка]

https://timsong-cpp.github.io/cppwp/n48 ... .object#10
Запускает ли std::construct_at это время жизни или просто вызывает конструктор объекта, который уже существует на месте (в этом случае мой код будет UB)?
Что заставило меня усомниться, так это пример, представленный в cppreference, который проходит через std::bit_cast, чтобы начать жизнь объекта (таким образом, AFAIU, в другой ячейке памяти, чем предоставленное хранилище).

дальнейшие исследования:

Код: Выделить всё

std::construct_at
:

Эффекты: эквивалентно:
return ::new (voidify(*location)) T(std::forward( args)...);

https://timsong-cpp.github.io/cppwp/n48 ... onstruct#2
Создание объектов «акцент мой»:

Объект создается по определению, по новому выражению< /strong> с помощью операции, которая неявно создает объекты (см. ниже), при неявном изменении активного члена объединения или при создании временного объекта.

https://timsong-cpp.github.io/cppwp/n48 ... o.object#1
Связывая эти два раздела, правильно ли сказать, что std::construct_at фактически начинает жизнь объекта в заданном месте?

Подробнее здесь: https://stackoverflow.com/questions/790 ... t-lifetime

Вернуться в «C++»