取消引用通過LLVM的源代碼,我偶然發現了這行代碼引用,並在同一指令
MachineInstr *MI = &*I;
我有點福利局C++和引用和指針之間的區別是相當模糊的我想知道,和我認爲這個區別有些事情要做,但這個操作對我來說沒有意義。有人有這樣的解釋嗎?
取消引用通過LLVM的源代碼,我偶然發現了這行代碼引用,並在同一指令
MachineInstr *MI = &*I;
我有點福利局C++和引用和指針之間的區別是相當模糊的我想知道,和我認爲這個區別有些事情要做,但這個操作對我來說沒有意義。有人有這樣的解釋嗎?
I
的類型可能是某種迭代器或智能指針,它具有一元operator*()
重載以產生MachineInstr&
。如果你想得到一個指向I
引用的對象的內置指針,你可以使用*I
得到一個對象的引用,然後你使用這個引用的地址,使用&*I
。
'I'實際上是一個迭代器。這是完全有意義的:) –
如果'I'只是*指針,這沒有任何意義。很可能它是一個智能指針(一個「行爲」類似指針的類)。對於一個原始指針,'*'和'&'有效地取消了所有其他指針。但對於智能指針,這是一種獲取指向對象的* raw *指針的方法。 – jalf
對不起,我的意思是迭代器,我寫了指針。我的錯 –
C++允許重載解引用操作符,因此它使用對象上的重載方法,然後它將結果的地址放入指針中。
請注意,地址運算符(前綴'&')也可以重新定義,但理智的代碼不會這樣做,所以通常可以忽略它。 – delnan
@delnan:順便說一句,即使在這種情況下,您仍然可以使用[奇怪技巧](http://stackoverflow.com/q/6494591/214671)獲取地址。 –
@delnan會很有趣:P –
本聲明:
MachineInstr *MI = &*I;
取消引用I
與*
,並得到了與&
結果的地址,然後將其分配給MI
這是一個指向MachineInstr
。它看起來像I
是一個迭代器,因此*I
是存儲在容器中的值,因爲迭代器定義*
運算符以在迭代點返回項目。容器(例如列表)必須包含MachineInstr
。這可能是std::list<MachineInstr>
。
是你想知道的'&*'嗎? – jalf
@jalf:關於「在同一指令中引用和取消引用」的標題,我認爲所有內容都指向了yes) – Zeta
@jalf:的確如此:我沒有看到有任何理由要這樣做 –