std::byte 指针是否应该用于指针运算?

Should std::byte pointers be used for pointer arithmetic?

似乎 std::byte 已成为(在 C++17 中)使用包含 object 表示的缓冲区的方式,但尚不清楚此意图是否仍允许执行指针运算。

标题中的问题故意表述为应该,因为我正在寻找推荐。例如,void* 可以作为 gcc 扩展用于指针运算,但不是标准的(至少这是 true for C), hence a possibility but not a recommendation.

我知道 std::byte 的动机是将字符和数字方面从 byte 的概念中分离出来。但与此同时,指针运算是否保留?

编辑:进行了调整以澄清我希望使用 std::byte* 来执行 "pointer arithmetic" 而不是 std::bytes

中存储的指针数值

是的,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++ 中有许多关于允许优化器 "know" 无法修改特定值的怪癖。

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* 引入的新陷阱。