2012-12-25 9 views
5

取消引用通過LLVM的源代碼,我偶然發現了這行代碼引用,並在同一指令

MachineInstr *MI = &*I; 

我有點福利局C++和引用和指針之間的區別是相當模糊的我想知道,和我認爲這個區別有些事情要做,但這個操作對我來說沒有意義。有人有這樣的解釋嗎?

+0

是你想知道的'&*'嗎? – jalf

+0

@jalf:關於「在同一指令中引用和取消引用」的標題,我認爲所有內容都指向了yes) – Zeta

+0

@jalf:的確如此:我沒有看到有任何理由要這樣做 –

回答

8

I的類型可能是某種迭代器或智能指針,它具有一元operator*()重載以產生MachineInstr&。如果你想得到一個指向I引用的對象的內置指針,你可以使用*I得到一個對象的引用,然後你使用這個引用的地址,使用&*I

+0

'I'實際上是一個迭代器。這是完全有意義的:) –

+0

如果'I'只是*指針,這沒有任何意義。很可能它是一個智能指針(一個「行爲」類似指針的類)。對於一個原始指針,'*'和'&'有效地取消了所有其他指針。但對於智能指針,這是一種獲取指向對象的* raw *指針的方法。 – jalf

+0

對不起,我的意思是迭代器,我寫了指針。我的錯 –

2

C++允許重載解引用操作符,因此它使用對象上的重載方法,然後它將結果的地址放入指針中。

+2

請注意,地址運算符(前綴'&')也可以重新定義,但理智的代碼不會這樣做,所以通常可以忽略它。 – delnan

+0

@delnan:順便說一句,即使在這種情況下,您仍然可以使用[奇怪技巧](http://stackoverflow.com/q/6494591/214671)獲取地址。 –

+0

@delnan會很有趣:P –

2

本聲明:

MachineInstr *MI = &*I; 

取消引用I*,並得到了與&結果的地址,然後將其分配給MI這是一個指向MachineInstr。它看起來像I是一個迭代器,因此*I是存儲在容器中的值,因爲迭代器定義*運算符以在迭代點返回項目。容器(例如列表)必須包含MachineInstr。這可能是std::list<MachineInstr>

相關問題