这符合严格的别名规则吗?

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只是用来保存对象的地址,地址只是解引用为对象的真实类型。

所以除非它被取消引用到不相关的类型,否则严格的别名规则没问题吗?

严格别名仅在您尝试通过 pointer/reference 访问对象时适用。您没有尝试通过 void* 访问该对象,因此甚至不适用严格的别名规则(此处保护您的规则是 static_cast 上的规则,该规则允许它将指针转换为void* 和返回的任何类型,只要您将其转换回的类型 完全 之前的类型)。

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