我听不懂报价(特别是粗体部分(:
类型为"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
也不能用于访问它所指向的对象的值,因为这将违反指针别名规则。因此,演员阵容的结果很可能对任何事情都没有用处。