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>里。