簡體   English   中英

嚴格的混疊規則違反

[英]Strict aliasing rule violation

在提供的示例中來自isocpp.org常見問題的鏈接中,正在構造Fred對象,並將其放置在新的緩沖區中,該緩沖區正分配給另一個對象,即為

char memory[sizeof(Fred)]

眾所周知,嚴格的別名規則使我們可以做相反的操作,即對於任何類型的對象,都可以在其上使用char*點,並且可以取消引用該指針並根據需要使用它。

但是在此示例中,情況正相反。 我想念什么?

嚴格的別名規則沒有提及必須將Fred*強制轉換為char* 只有char*Fred*類型的變量可以指向同一對象,並可以用來訪問它。

引用[basic.lval]第8段

如果程序嘗試通過以下類型之一以外的glvalue訪問對象的存儲值,則行為未定義:

  • 對象的動態類型,

    [..]

  • 字符或無符號字符類型。

新的Placement創建一個新對象。 它不會為舊對象起別名。 執行placement-new時,舊對象(此示例中為char數組)被認為已停止存在。

在進行新的放置之前,存儲已充滿char對象。 新放置后,將有一個Fred對象填充存儲空間。

由於沒有別名,因此沒有嚴格的別名問題。

暫無
暫無

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

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