[英]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 稱為a
和b
。
&x2[0][0]
是一個指向a
的第一個元素的int*
。
&x2[0][0] + 10
是一個指向最后一個元素a
的int*
指針。 這個指針值的地址也是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.