interior_ptr

マネージドなポインタと考えればいいのかな?

#include "stdafx.h"
#include <cstdio>

using namespace System;

void equals_val(String^% s1, String^% s2)
{
    // Stringの値を比較
    Console::WriteLine(s1 == s2);
}

void equals_ref(String^% s1, String^% s2)
{
    // トラッキングハンドルの参照先を比較
    Console::WriteLine(Object::ReferenceEquals(s1, s2));
}

void equals_ptr(String^% s1, String^% s2)
{
    // トラッキングハンドル自体をを比較
    // p1はメモリコンパクションでs1のアドレスが変更されてもs1を指し示す
    // &s1はs1を指し示すが、s1のアドレス自体ではない
    interior_ptr<String^> p1 = &s1;
    interior_ptr<String^> p2 = &s2;
    Console::WriteLine(p1 == p2);
}

void main()
{
    String^ s1 = "hello";
    String^ s2 = "he"; s2 += "llo";
    String^ s3 = s1;

    puts("equals_val");
    equals_val(s1, s1);
    equals_val(s1, s2);
    equals_val(s1, s3);

    puts("equals_ref");
    equals_ref(s1, s1);
    equals_ref(s1, s2);
    equals_ref(s1, s3);

    puts("equals_ptr");
    equals_ptr(s1, s1);
    equals_ptr(s1, s2);
    equals_ptr(s1, s3);
}

/* 結果
equals_val
True
True
True
equals_ref
True
False
True
equals_ptr
True
False
False
 */