最終更新日時:
が更新

履歴 編集

function template
<memory>

std::addressof(C++11)

namespace std {
  template <class T>
  T* addressof(T& r) noexcept;
}

概要

変数のアドレスを必ず取得する。

operator&() をオーバーロードしたクラスであっても、正しくそのオブジェクトのアドレスが欲しいという要求がある。

addressof()関数は、operator&() がオーバーロードされていても、変数のアドレスを取得できる。

戻り値

変数rのアドレスを返す。

例外

投げない

#include <memory>
#include <iostream>

struct useless_type {};

// operator&がオーバーロードされたクラス
class nonaddressable {
public:
  useless_type operator&() const { return useless_type(); }
};

int main()
{
  {
    int x = 3;
    int* p1 = std::addressof(x); // OK : アドレス取得できる
    int* p2 = &x; // OK : アドレス取得できる
  }
  {
    nonaddressable x;
    nonaddressable* p1 = std::addressof(x); // OK : アドレス取得できる
//  nonaddressable* p2 = &x; // エラー!アドレス取得できない
  }
}

出力

バージョン

言語

  • C++11

処理系

  • Clang: ??
  • GCC:
  • GCC, C++11 mode: 4.7.0
  • ICC: ??
  • Visual C++: 11.0, 12.0
    • Visual C++ 11.0はマニュアル(MSDNライブラリ)に記載がないものの、実装されている。

参照