Но я' Меня беспокоит тот факт, что std::byte может неявно создавать объекты в массиве, а char не может:
"Объекты неявных типов времени жизни также может быть неявно создано: за исключением постоянного оценка, операции, которые начинают жизнь массива типа unsigned char или std::byte, и в этом случае такие объекты создаются в массиве".
Рассмотрим этот пример вручную контролировать выделение памяти и время жизни объекта int:
Код: Выделить всё
#include
#include
int main() {
//OPTION 1: allocate storage with an array of char
//(no objects are created; char cannot implicitly create objects in an array)
char* buffer = (char*)malloc(sizeof(int));
//OPTION 2: allocate storage with an array of std::byte
//(does std::byte implicitly create objects in the array here? it's capable of doing so)
//std::byte* buffer = (std::byte*)malloc(sizeof(int));
//explicitly create an int object, starting its lifetime:
int* ptr = ::new(buffer) int(11);
//explicitly destroy the int object, ending its lifetime:
std::destroy_at(ptr);
//deallocate storage (if this is an std::byte array, should you call their destructors first?):
free(buffer);
}
Не лучше ли использовать char, чтобы избежать потенциального неопределенного поведения, связанного со временем жизни любого неявно созданного std::byte объекты (случайный доступ к ним за пределами их жизни, забывание уничтожить их перед освобождением памяти и т. д.)?
Мне просто нужен блок необработанной памяти где я могу вручную создавать и уничтожать объекты, а не блок памяти плюс кучу неявных объектов, о которых я никогда не просил, которые могут незаметно привести к неопределенному поведению, пока я пытаюсь использовать блок.
Спасибо.
Подробнее здесь: https://stackoverflow.com/questions/793 ... te-vs-char