簡體   English   中英

嚴格的別名規則可以嗎?

[英]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*並返回,只要你將它轉換回類型也正是它以前的類型)。

同樣,允許指向同一類型的指針。 所以tstatic_cast<T*>結果允許別名,因此兩者都不違反嚴格的別名。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM