2

我无法理解报价(特别是粗体部分):

“指向 cv1 void 的指针”类型的纯右值可以转换为“指向 cv2 T 的指针”类型的纯右值,其中 T 是对象类型,而 cv2 与 cv1 具有相同的 cv 限定或大于 cv1 的 cv 限定。如果原始指针值表示内存中一个字节的地址A,并且A不满足T的对齐要求,则结果指针值未指定。

int i = 0;
void *vp = &i;
auto *res = static_cast<double*>(vp);

我的问题是:

  • res(address of )所指向的地址是否int满足 的对齐要求double

  • 结果指针res是否具有未指定的值?

  • 当我有这样的事情时:类型不比目标类型更严格static_cast<double*>(static_cast<void *>(&i))
    吗?所以这个表达式的结果不是未指定的idouble

4

1 回答 1

2

res(int的地址)指向的地址是否满足double的对齐要求?

这将取决于实施。很可能不会。通常, 的对齐要求int小于 的double

例如,在 Linux 上使用的 x86-64 System V ABI 上,int具有对齐要求4double具有8.

您可以检查是否满足对齐要求,例如使用以下内容static_assert

static_assert(alignof(int) >= alignof(double));

结果指针 res 是否具有未指定的值?

如果没有满足对齐要求(即static_assert失败),是的。否则它将指向对象i

当我有这样的事情时: static_cast<double*>(static_cast<void *>(&i))

这与片段中显示的内容完全相同。


请注意,即使满足对齐要求,res也不能用于访问它指向的对象的值,因为这会违反指针别名规则。所以演员表的结果很可能对任何事情都没有用。

于 2022-02-26T16:38:20.667 回答