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 */