在C ++ 17中,std::byte
似乎已经成为处理持有对象表示形式的缓冲区的方法,但是目前尚不清楚这种意图是否仍然允许执行指针算术。
标题中的问题故意用应该表示,因为我在寻找推荐。例如,void*
可以作为gcc扩展用于指针算术,但不是标准的(至少是true for C),因此有可能是not a recommendation。
我知道std::byte
的动机是将字符和数字方面与 byte 的概念分开。但是同时,指针算法会保留吗?
编辑:经过调整,以澄清我要使用std::byte*
而不是存储在std::byte
s中的指针的数值进行“指针算术”
答案 0 :(得分:4)
是的,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
的{{1}}值为.x
。
这些不是3
引入的新陷阱。