簡體   English   中英

reinterpret_cast指向指針的迭代器

[英]reinterpret_cast an iterator to a pointer

我有一個東西的迭代器。 如果我想將當前項轉換為指向該項的指針,為什么這樣做:

thing_pointer = &(*it);

但這不是:

thing_pointer = reinterpret_cast<Thing*>(it);

這是我想要理解的編譯器錯誤: http//msdn.microsoft.com/en-us/library/sy5tsf8z(v = vs。90).aspx

以防萬一,迭代器的類型是std::_Vector_iterator<std::_Vector_val<Thing,std::allocator<Thing> > >

&(*it);

*重載以執行邏輯上的意思:將迭代器類型轉換為其指向的對象。 然后,您可以安全地獲取此對象的地址。

而在

reinterpret_cast<Thing*>(it);

您告訴編譯器將it對象重新解釋為指針。 但它可能根本不是一個指針 - 它可能是一個50字節的結構,對於你所知道的一切! 在這種情況下,它的第一個sizeof (Thing*)字節絕對不會指向任何合理的東西。

提示: reinterpret_cast<>幾乎總是錯誤的。

義務標准行情,強調我的:

5.2.19重新解釋演員表

1 / [...]下面列出了可以使用reinterpret_cast顯式執行的轉換。 使用reinterpret_cast不能顯式執行其他轉換。

4 /指針可以顯式轉換為足以容納它的任何整數類型。 [...]

5 /整數類型或枚舉類型的值可以顯式轉換為指針。 [...]

6 /函數指針可以顯式轉換為不同類型的函數指針。 [...]

7 /對象指針可以顯式轉換為不同類型的對象指針。 [...]

8 /有條件地支持將函數指針轉換為對象指針類型(反之亦然)。 [...]

9 /空指針值(4.10)被轉換為目標類型的空指針值。 [...]

10 / [...]“指向T1類型X成員的指針”可以顯式轉換為“指向T2類型Y成員的指針”[...]

如果可以使用reinterpret_cast將“指向T1的指針”類型的表達式顯式轉換為“指向T2的指針”類型,則可以將11 / A [...] T1轉換為“對T2的引用”類型。 [...]

除了4 /,5 /和11 /中提到的積分到指針和值到參考的轉換之外,可以使用reinterpret_cast執行的唯一轉換是指針到指針的轉換。

但是在:

thing_pointer = reinterpret_cast<Thing*>(it);

it不是指針 ,而是對象。 事實上,這個對象被設計為以多種方式模擬指針,但它仍然不是指針。

  1. 因為迭代器的*運算符被重載並且它返回對它所指向的對象的引用。
  2. 你可以通過thing_pointer = *(reinterpret_cast<Thing**>(&it));強制它thing_pointer = *(reinterpret_cast<Thing**>(&it)); 但這是未定義的行為。

因為迭代器不是指針。 它是一類實現定義的結構,如果你試圖將它重新解釋為一個指針,迭代器類的原始數據將被視為一個內存指針,它可能,但可能不會指向有效的內存

第一個獲取對象的引用,然后獲取它的地址,給出指針。

第二個嘗試將迭代器強制轉換為指針,這可能會失敗,因為大多數類型都不能轉換為指針 - 只有其他指針,整數和具有轉換運算符的類類型。

暫無
暫無

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

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