INTSourceChangelist:2622058 Availability:Public Title:共有の参照 Crumbs:%ROOT%, Programming, Programming/UnrealArchitecture/SmartPointerLibrary Description:初期化されていないまたは NULL を代入することができないスマートポインタ型 Version:4.9 [TOC(start:2)] **共有の参照** は non-nullable 型のシェアード ポインタです。つまり空の共有の参照を作成できず、また共有の参照に NULL を代入することもできません。オブジェクトへのアクセスの安全性が確保されるため、より安全でクリーンなコードが書けます。実際に、シェアードポインタとは異なり常に有効となるため、共有の参照には **IsValid()** メソッドさえありません。できれば、シェアードポインタの代わりに常に共有の参照を使用することが推奨されています。 空/nullable 参照が必要な場合、 [](Programming/UnrealArchitecture/SmartPointerLibrary/SharedPointer) を代わりに使用してください。 ## 宣言と初期化 共有の参照は常に有効なオブジェクトと初期化され、初期化せずに宣言することはできません。 新規の共有の参照の作成例: // Create a shared reference to a new node (新しいノードに共有の参照を作成します) TSharedRef NodeRef( new FTreeNode() ); 初期化せずにまたは NULL を代入した共有の参照の宣言は絶対にできません: TSharedRef EmptyBool; // Will not Compile!! (コンパイルしません !!) ##共有の参照の使用法 ほとんどの場合、共有の参照の使用はシェアードポインタの使用に似ています。 // Create a shared reference to a new node (新しいノードに共有の参照を作成します) TSharedRef NodeRef( new FTreeNode() ); NodeRef->ListChildren(); ( *NodeRef ).ListChildren(); const FTreeNode& NodeVar = NodeRef.Get(); 繰り返しになりますが、主な違いは共有の参照を NULL に設定できないことです。 TSharedRef Node = NULL; // Will not Compile!! (コンパイルしません !!) ### ポインタと参照変換 共有の参照はシェアードポインタに暗黙的に変換するため、参照からのポインタの作成は常に安全が確保されます。共有の参照をシェアードポインタへ代入したり、シェアードポインタを要求するメソッドへ共有の参照を渡すなどが例としてあげられます。 TSharedPtr SomeNodePtr = NodeRef; しかし、ポインタからの変換は潜在的に危険な行為であるため、**ToSharedRef()** 関数を使用した明示的な変換の実行が強制されます。 // Explicitly reference a pointer. (明示的にポインタを参照する。)Will assert if the pointer is not valid! (ポインタが無効な場合アサートします!) NodeRef = SomeNodePtr.ToSharedRef(); [REGION:note] C++ ポインタの * 演算子と同じような方法で、ToSharedRef() 関数の使用はオブジェクトが無効な場合アサートします。 [/REGION]