Но меня беспокоит тот факт, что 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:
std::free(buffer);
}
Не лучше ли использовать char, чтобы избежать потенциального неопределенного поведения, связанного со временем жизни любого неявно созданного std::byte объекты (доступ к ним снаружи из их жизни случайно, забыв уничтожить их перед освобождением памяти и т. д.)?
Спасибо.
Подробнее здесь: https://stackoverflow.com/questions/793 ... te-vs-char