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仅用于保存对象的地址,并且该地址仅取消引用该对象的真实类型。
所以除非它被解除引用到一个不相关的类型,否则严格的别名规则就可以了?
答案 0 :(得分:5)
仅在尝试通过指针/引用访问对象时才应用严格别名。您没有尝试通过void*
访问该对象,因此严格别名规则甚至不适用(此处保护您的规则是static_cast
上的规则,允许它将指针转换为任何类型为void*
并返回,只要您将其转换回的类型完全之前的类型。)
同样,允许指向同一类型的指针。因此,t
和static_cast<T*>
的结果可以使用别名,因此两者都不会违反严格的别名。