微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

结构体中的指针运算 来自第 Additive operators 部分

如何解决结构体中的指针运算 来自第 Additive operators 部分

在数组中,允许指针运算(只要结果不超过边界,其中结束边界是数组末尾的一个)。

// Legit
int m[3] = {0,1,2};
int const *p = m;
std::cout << *p << *(p + 1) << *(p + 2) << std::endl;

标准是否允许使用包含相同基本类型的连续成员变量的标准布局结构进行这样的指针运算?

// Well defined???
struct MyStruct {
    int a,b,c;
};
static_assert(std::is_standard_layout_v<MyStruct>);

MyStruct  m = {0,2};
int const *p = &m.a;
std::cout << *p << *(p + 1) << *(p + 2) << std::endl;

我当然可以比较指向各个变量的指针(即 &m.a < &m.b),因为它们是同一对象的成员,但我无法确定 &m.a+1 是否保证为 &m.b

我知道这可能适用于大多数编译器,但我很好奇标准的内容(C++20,如果重要的话)。

解决方法

来自第 Additive operators 部分

(强调我的)

当一个整数类型的表达式 J 与指针类型的表达式 P 相加或相减时,结果的类型为 P。

  • 如果 P 的计算结果为空指针值而 J 的计算结果为 0,则结​​果为空指针值。
  • 否则,如果 P 指向具有 n 个元素的数组对象 x 的数组元素 i,则表达式 P + J 和 J + P(其中 J 的值为 j)指向(可能是-假设)数组元素 i + j [...]
  • 否则,行为未定义。

底线,不能保证基础类型是否不是数组。

就您而言,std::is_standard_layout_v 提供了关于布局本身的保证,其中可以包括对其中包含的数组的保证,但它并不将 struct 本身限定为元素数组,其中标准期望使用指针算法。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。