Reinterpret_cast 和平凡的預設建構子:未定義行為之旅
cppreference 文件曾經聲稱可以使用以下命令建立平凡的可普通可普通可可使用構造物件在適當對齊的記憶體上進行reinterpret_cast。然而,此斷言後來被修改,以強調使用placement-new明確初始化此類物件的要求。
生命週期之謎
如果reinterpret_cast確實創建了對象,我們會遇到關於他們一生的困境。轉換操作本身會標誌著物件的開始嗎?或者它會更早發生,當使用像alignas(X) char buffer[sizeof(X)]這樣的表達式分配儲存時?
在後一種情況下,它提出了一個有趣的可能性,即儲存之間的條件語句分配和轉換可能會建構一個 X 物件或其他一些簡單的預設可建構實體 Y。
澄清指南標準
不幸的是,C 標準明確排除了這種無定形物件的創建。根據 [intro.object]/1,物件只能透過定義、new 表達式、啟動聯合體的活動成員或建立臨時物件來產生。
甚至不是空的存在
空的初始化生命週期的概念與這種情況無關。為了應用這個概念,一個物件必須先存在,但這裡不是這種情況。
永遠未定義
縱觀 C 的歷史,reinterpret_casting 的行為微不足道預設可建構物件始終未定義。 C 11 和 C 1z 都遵循不同的物件必須具有不同的地址的基本原則,這使得在同一儲存中創建多個物件成為薛丁格貓般的悖論。
結論
reinterpret_cast 操作並不是建立物件的神奇工具。在嘗試調用其創造力時,程式設計師冒著調用未定義行為並將其程式碼陷入不可預測性的危險深淵的風險。
以上是`reinterpret_cast` 何時實際建立物件?的詳細內容。更多資訊請關注PHP中文網其他相關文章!