char* t = (char*)malloc(sizeof(float) * 2);
*(float*)t = 1.0f; // or *reinterpret_cast<float*>(t) = 1.0f;
*((float*)t 1) = 2.0f; // #1
在一些 SO 問題中,有答案說上述代碼是未定義的行為,因為違反了嚴格別名。
但是,我最近閱讀了P0593論文。
我認為論文是說如果您使用某些操作
(例如定義 char/byte 陣列、malloc、operator new ......)分配/獲取一些存盤,
您可以將存盤本身視為隱式生命周期型別,而無需顯式物件創建,因為您想要的隱式型別將被隱式創建。
- 如果我的想法是正確的,那么上面的代碼現在不違反嚴格別名規則嗎?
- 在上面的代碼中,浮點陣列物件是隱式創建的嗎?
(如果不是,#1是UB,因為我在不是陣列的存盤上嘗試了指標運算)
(如果你聽不懂我在說什么,請告訴我......我不擅長英語......)
uj5u.com熱心網友回復:
是的,代碼是合法的,物件是隱式創建的。(C 20 起)
我懷疑你是否需要std::launder。似乎不是,malloc它是否隱含(注意“回傳指向合適的創建物件的指標”)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/436779.html
