[英]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.