这符合严格的别名规则吗?
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*
和返回的任何类型,只要您将其转换回的类型 完全 之前的类型)。
同样,允许指向相同类型的指针别名。因此 t
和 static_cast<T*>
的结果允许使用别名,因此两者都不会违反严格的别名。
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*
和返回的任何类型,只要您将其转换回的类型 完全 之前的类型)。
同样,允许指向相同类型的指针别名。因此 t
和 static_cast<T*>
的结果允许使用别名,因此两者都不会违反严格的别名。