簡體   English   中英

std::launder 可達性

[英]reachability with std::launder

我試圖從CPP 參考中理解以下片段。 有人可以更詳細地解釋為什么x2[1]無法從source訪問嗎? 例如,我們不能通過&x2[0][0] + 10到達它嗎?

int x2[2][10];
auto p2 = std::launder(reinterpret_cast<int(*)[10]>(&x2[0][0])); 
// Undefined behavior: x2[1] would be reachable through the resulting pointer to x2[0]
// but is not reachable from the source

可達性條件基本上詢問是否可以通過指針算法訪問給定字節 memory 並從給定指針reinterpret_cast _cast。 在鏈接的 cppreference 頁面上給出了實際上相同的技術定義:

(字節可以通過指向 object Y 的指針訪問,如果這些字節在 object Z 的存儲中,該 Z 可以與 Y 進行指針互換,或者在 Z 是其元素的緊鄰數組中)

x2是 2 arrays 的10 arrays 的數組int 假設我們將兩個 arrays 稱為ab

&x2[0][0]是一個指向a的第一個元素的int*

&x2[0][0] + 10是一個指向最后一個元素aint*指針。 這個指針值的地址也是b開始的地址。 但是,無法通過reinterpret_cast獲得指向b或其元素之一的指針,因為&x2[0][0] + 10不指向任何 object 可與b或其元素之一進行指針互換。

就技術定義而言,唯一可與a的第一個元素相互轉換的 object 指針是 object 本身。 因此,從指向 a 的第一個元素的指針的可到達字節只是a a字節,它是立即包含此 object 的數組。

因此,通過&x2[0][0]的可達字節只是數組a的字節,不包括b 例如*(&x2[0][0] + 10) = 123; 有未定義的行為。

但是,如果std::launder返回指向a (類型為int(*)[10] )的指針,則(p2+1)[i]將是訪問b的所有元素的一種方式。 或者根據技術定義,緊鄰object p2指向的數組將是x2 ,因此x2的所有字節都是可達的。

這意味着之前不可訪問的std::launder字節將變得可訪問。 因此,調用具有未定義的行為。

暫無
暫無

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

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