关于[expr.static.cast]/13的困惑



我听不懂报价(特别是粗体部分(:

类型为"pointer to cv1 void"的prvalue可以转换为prvalue类型为"pointer to cv2 T",其中T是对象类型,cv2是与cv1相同或更高的cv资格如果原始指针值表示内存和A不满足T的对齐要求,则生成的指针值未指定

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

我的问题是:

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

  • 所得到的指针res是否具有未指定的值?

  • 当我有这样的问题时:static_cast<double*>(static_cast<void *>(&i))
    i类型是否不比目标类型double更严格?使得该表达式的结果是而不是未指定

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

这将取决于实现。很可能不会。典型地,int的对准要求小于double的对准要求。

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

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

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

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

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

当我有这样的东西时:static_cast<双*>(static_cast<void*>(&i((

这与代码段中显示的内容完全等效。


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

最新更新