[英]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*
并返回,只要你将它转换回类型也正是它以前的类型)。
同样,允许指向同一类型的指针。 所以t
和static_cast<T*>
结果允许别名,因此两者都不违反严格的别名。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.