繁体   English   中英

严格的别名规则可以吗?

[英]Is this ok with the strict aliasing rule?

struct Test {
    void doAction() {}
};

// Create and save into a void*
void *ptr = new Test;

// Real use through a Test*
Test *t = static_cast<Test *>(ptr);
t->doAction();

// Delete
delete static_cast<Test *>(ptr);

ptr仅用于保存对象的地址,并且该地址仅取消引用该对象的真实类型。

所以除非它被解除引用到一个不相关的类型,否则严格的别名规则是可以的呢?

仅当您尝试通过指针/引用访问对象时,才会应用严格别名。 您没有尝试通过void*访问该对象,因此严格的别名规则甚至不适用(此处保护您的规则是static_cast上的规则,允许它将指向任何类型的指针转​​换为void*并返回,只要你将它转换回类型也正是它以前的类型)。

同样,允许指向同一类型的指针。 所以tstatic_cast<T*>结果允许别名,因此两者都不违反严格的别名。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM