&演算子がオーバーロードされたクラスのアドレス取得
C++では、&演算子のオーバーロードが可能である。そのため、そういったオブジェクトに対して&演算子を使用しても、実際のオブジェクトのアドレスが取得できない場合がある。そういったクラスを実装することに対しての議論の余地はあるものの、言語仕様的には可能となっている。このパターンは、そういったクラスのアドレスを取得するためのものである。
下の例では、&演算子がprivateとなっているため、コンパイルに失敗する。また、privateでないにしても、double型からポインタ型に変換することも可能ではないし意味のないものである。
class nonaddressable 
{
public:
    typedef double useless_type;
private:
    useless_type operator&() const;
};
 
int main()
{
  nonaddressable na;
  nonaddressable * naptr = &na // Compiler error here.
}
Address-of パターンでは、キャストを連続して使用することでオブジェクトのアドレスを取得する。
template 
T * addressof(T & v)
{
  return reinterpret_cast(& const_cast(reinterpret_cast(v)));
}
int main()
{
  nonaddressable na;
  nonaddressable * naptr = addressof(na); // No more compiler error.
}
C++11からは、この関数はstd::addressofとして ヘッダに含まれている。
C++17以降、このテンプレートはconstexprとしてマークされています。
More C++ Idioms/Address Of
|あどれすちのしゅとく]]