std::aligned_storage. buffer[sizeof(T) * head] давай подскажу еще один подход.struct alignas( 16 ) Vector2 final
{
float x;
float y;
};sizeof(T) * head найдет для него неправильное место, не выравненное. А ведь выравнивание может быть и на 64, и на 128, и на 256 байт.std::aligned_storage{?] в качестве ячейки своего ЦБ. if (size < maxSize) и для чего существует второй - который под первым.size и maxSize. А так же - почему функция называется add и имеет такие параметры.GetComputerNameA - именно BOOL.BOOL является псевдонимом для int, значение которого неявно приводится к char чтобы соответствовать одной из перегрузок operator = у std::string.'\01' или '\00' внутри. Но к ошибке трансляции это не приводит потому что все спокойно неявно приводится.'FIO' имеет, внезапно, тип int и значение примерно 4606287.unsigned char не подходит для подмены. Стандартом разрешены только char и std::byte.uint8_t или чем-то подобным.alignas(alignof(T)) uint8_t buffer[sizeof(T) * capacity];std::byte, т.к. только он и char формально позволят тебе подмену типа на T* без UB. А uint8_t формально является unsigned int длиной в 8 бит. Думаю, char тебе тут не понравится, поэтому предлагаю std::byte.
Поэтому вопрос может быть только в различиях со стороны удобства чтения другим пользователем.
Сейчас ты рассуждаешь вот так, что тебе вполне нормально читать код с деструктором и конструктором. Когда у тебя будет в голове задача и когда ты будешь должен быстро сориентироваться в коде, нормально такой код ты уже не прочитаешь. Тебе придется уже вчитываться и разбираться что тут в этих двух строках кода происходит. Заботиться следует именно о читателе в состоянии решения абсолютно чужой твоему текущему коду задачи.
Поэтому я и пишу о том, что код должен быть более логичным и более очевидным для читателя.
Просто посмотри на два этих участка кода.
и
Второй точно проще воспринимается?
newв никуда, который рискует быть вырезанным в результате оптимизации и явный вызов деструктора - это проще?