[英]Is the type cast from sockaddr_in* to sockaddr* a violation of "strict aliasing rule"?
[英]Strict aliasing rule violation
在提供的示例中來自isocpp.org常見問題的鏈接中,正在構造Fred對象,並將其放置在新的緩沖區中,該緩沖區正分配給另一個對象,即為
char memory[sizeof(Fred)]
眾所周知,嚴格的別名規則使我們可以做相反的操作,即對於任何類型的對象,都可以在其上使用char*
點,並且可以取消引用該指針並根據需要使用它。
但是在此示例中,情況正相反。 我想念什么?
嚴格的別名規則沒有提及必須將Fred*
強制轉換為char*
。 只有char*
和Fred*
類型的變量可以指向同一對象,並可以用來訪問它。
如果程序嘗試通過以下類型之一以外的glvalue訪問對象的存儲值,則行為未定義:
對象的動態類型,
[..]
字符或無符號字符類型。
新的Placement創建一個新對象。 它不會為舊對象起別名。 執行placement-new時,舊對象(此示例中為char
數組)被認為已停止存在。
在進行新的放置之前,存儲已充滿char
對象。 新放置后,將有一個Fred
對象填充存儲空間。
由於沒有別名,因此沒有嚴格的別名問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.