web-dev-qa-db-ja.com

operator&がオーバーロードされたときにオブジェクトのアドレスを確実に取得するにはどうすればよいですか?

次のプログラムを検討してください。

struct ghost
{
    // ghosts like to pretend that they don't exist
    ghost* operator&() const volatile { return 0; }
};

int main()
{
    ghost clyde;
    ghost* clydes_address = &clyde; // darn; that's not clyde's address :'( 
}

clydeのアドレスを取得するにはどうすればよいですか?

私は、あらゆる種類のオブジェクトに対して同等に機能するソリューションを探しています。 C++ 03ソリュ​​ーションはすてきですが、C++ 11ソリューションにも興味があります。可能であれば、実装固有の動作を避けましょう。

C++ 11のstd::addressof関数テンプレートですが、ここで使用することに興味はありません。標準ライブラリの実装者がこの関数テンプレートを実装する方法を理解したいと思います。

167
James McNellis

基本的に、オブジェクトをcharへの参照として再解釈し、そのアドレスを取得して(オーバーロードを呼び出さない)、ポインターを自分のタイプのポインターにキャストし直します。

Boost.AddressOfコードはまさにvolatileconstの資格を追加的に考慮してそれを行います。

97
Konrad Rudolph

私はこれを行うaddressofの実装を見てきました:

char* start = &reinterpret_cast<char&>(clyde);
ghost* pointer_to_clyde = reinterpret_cast<ghost*>(start);

これがどの程度適合しているかを聞かないでください!

11
Luc Danton

boost :: addressof とその実装を見てください。