cppreference утверждает, что std::allocator::allocate(std::size_t n) выделяет массив из n T, но не запускает время жизни реальных объектов T.
Таким образом, арифметика указателей хорошо определено, но cppreference утверждает, что доступ к объектам до их создания является неопределенным поведением, которое не является обязательным в стандарте.
Для объектов с неявным типом времени жизни это не обязательно: объекты, которые не существуют, не могут быть доступны в Basic.life#6 (спасибо Бену Фойгту за ссылку).
Но как насчет объектов с неявным типом времени жизни? В стандарте говорится, что хранилище создается из ::operator new, который неявно создает объекты.
Итак, в этом случае и массив, и подобъекты находятся в своем жизненном цикле?
В более общем плане, подобъекты неявных типов времени жизни также неявно создаются при неявном создании содержащего объекта?
Вот фрагмент, иллюстрирующий проблема:
Код: Выделить всё
static constexpr std::size_t N = 100;
using Type_t = int;
void process() {
auto allocator = std::allocator{};
auto ptr = allocator.allocate(1);
// ptr is the address of a std::array[1]
Type_t* it = ptr->data();
// accessing the data of the std::array:
// is it in its lifetime?
// starting the lifetime of the array's elements
for (std::size_t i = 0; i != N; ++i) {
std::construct_at(it, static_cast(i * i));
++it;
}
allocator.deallocate(ptr, 1);
}
Начал ли неявно срок своего существования (одиночный) std::array в хранилище, созданном allocate(1)?
Подробнее здесь: https://stackoverflow.com/questions/798 ... by-stdallo
Мобильная версия