Да, std::byte*
может использоваться для арифметики указателей.
И вы даже можете делать такие вещи, как
struct foo{int x,y};
foo f;
int* ptr_to_y = reinterpret_cast<int*>(reinterpret_cast<std::byte*>(&f)+offsetof(foo,y));
Вы должны быть осторожны, чтобы ваши местоположения были доступны через вашоперации.Тот факт, что указатели как целые числа получают правильный результат, не означает, что код C ++ выполняет определенное поведение.В C ++ есть ряд причуд, позволяющих оптимизатору «знать», что определенное значение не может быть изменено.
struct loc {
int x,y;
};
void f( int* );
loc work( loc l ) {
l.x=3;
f(&l.y);
return l;
}
в приведенном выше случае, кто-то, кто использовал указатель &l.y
для арифметики указателей(в пределах f
) и изменение l.x
, независимо от того, перешли они на std::byte*
или нет, будет вести неопределенное поведение.Компилятору разрешается предполагать, что возвращенное значение l
будет иметь значение .x
, равное 3
.
. Это не новые ловушки, введенные std::byte*
.