似乎std::byte已经成为使用保存对象表示形式的缓冲区的方式(在C ++ 17中),但是尚不清楚此意图是否仍然允许执行指针算术。

标题中的问题是故意措辞的,因为我正在寻找建议。例如,void*可以用作gcc扩展的指针算术,但不是标准的(至少是true for C),因此可能是not a recommendation

我知道std::byte的动机是将字符和数字方面与字节的概念分开。但是同时,指针算法是否仍然存在?

编辑:调整以澄清我要使用std::byte*而不是std::byte s中存储的指针的数值来进行“指针算术”

最佳答案

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

关于c++ - 应该将std::byte指针用于指针算术吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52761440/

10-11 22:44
查看更多