More C++ Idioms/取址

維基教科書,自由的教學讀本

類別 運算子 指標

取址(Address Of)
[編輯]

目的[編輯]

查找具有重載了一元按位與(&)運算符的類的對象的地址。

別名[編輯]

動機[編輯]

C++允許類重載一元按位與(&)運算符。該運算符返回的類型不需要是對象的真實地址。這樣的類具有高度的爭議性,但C++語言仍然允許它的存在。取址慣用語取得對象的真實位址,無論該對象所屬的類是否重載了一元按位與(&)運算符和它的訪問權限。

在以下的範例,main 將編譯失敗因為類別nonaddressable中成員函數operator &是私有的(private)。儘管此運算符是可訪問的,將返回類型double轉換成指針是不可能或沒有意義的。

class nonaddressable 
{
public:
    typedef double useless_type;
private:
    useless_type operator&() const;
};

int main()
{
  nonaddressable na;
  nonaddressable * naptr = &na; // 這裡將導致編譯錯誤
}

解決方案與範例程式[編輯]

取址慣用語利用一系列類型轉換(cast)取得一個對象的地址。

template <class T>
T * addressof(T & v)
{
  return reinterpret_cast<T *>(& const_cast<char&>(reinterpret_cast<const volatile char &>(v)));
}
int main()
{
  nonaddressable na;
  nonaddressable * naptr = addressof(na); // 不再有編譯錯誤了
}

C++11[編輯]

在C++11中,引入了函數std::addressof以解決此問題。

已知應用[編輯]

在新C++11標準中,此函數已被包含在了頭文件<memory>里。

相關的慣用語[編輯]

參考[編輯]