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

相关的惯用语[编辑]

参考[编辑]