во второй версии делаю:
Код: Выделить всё
// 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;
}
Я хотел полагаться на тот факт, что 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