2017-02-08 93 views
4

考慮以下代碼:如何獲取指向參考成員的指針?

struct AA 
{ 
    int& rr; 
}; 

有沒有辦法獲得指針(或者引用)AA::rr爲了獲得這個?

AA* aa; 
auto mm = &AA::rr; // error: cannot create pointer to reference member ‘AA::rr’ 
aa ->* mm; 

而且在gcc-7.0.1decltype(AA::mm)只是int&。這是否符合標準?這是否有意義?


編輯

對不起球員,我制定了問題不是非常好。不要抱怨引用不是對象,或者不存在指向引用的指針。目標很自私。鑑於struct AA { int& rr; };我只是希望能有這樣的功能:

template < typename Class, typename Member > 
void test(Member Class::*) { } 

,調用test(&AA::rr)當我想ClassAAMemberint&int。所以我甚至不需要指針本身,但它的類型將允許檢索類類型和成員類型。

+1

'汽車毫米=(AA-> RR);' –

+3

引用不是對象遠作爲標準而言,所以你不能做像獲得地址或內存表示那樣的事情。我認爲這是不可能的。 – nwp

+0

@Dan給你一個指向'rr'引用的對象的指針,而不是我認爲是目標的'rr'本身。 – nwp

回答

5

如何獲取指向引用(成員)的指針?

您無法獲得指向(或引用或指向數組的引用)的指針。在C++中沒有「指向引用」的類型。這是因爲引用不需要存儲,所以甚至可能沒有存儲引用的地址。

將addressof運算符應用於引用時,所得到的是所引用對象的地址。

+0

更重要的是,我不認爲成員參考必須有存儲是完全正確的。給定足夠寬鬆的ABI,足夠積極的優化器以及在編譯時可評估的「合作」構造函數,編譯器可能跳過引用成員。 – Angew

+0

@Angew夠公平的。我很難想象如何優化它,但我爲此付出了努力。 – user2079303

2

圖片講千言萬語

picture

引用並沒有真正在內存中的容器,它們提供更像一個別名給原來的變量,因此你不能讓指針引用,因爲引用沒有自己的內存位置。

但是,您可以獲取引用的地址,它是引用的變量。在這個例子中,如果你是cout & rx和& x,它們是一樣的。

所以可能你會希望得到一個指向它引用的對象,而不是指針引用

+0

*「引用在內存中沒有真正的容器」*。那麼,每個參考可能會或可能不會。但既然都沒有保證,通常最壞的情況必須假設。最糟糕的情況是沒有地址。內存優化的最壞情況是使用存儲。好的圖片:) – user2079303

+0

@ user2079303好吧,我永遠不知道引用也許有容器,肯定會做更多的研究,謝謝指出! –

+2

'int &x = x;'初始化參考(未定義的行爲) –