optional<T&>
は、その使用が疑わしいため、C++ 標準化トラックから削除されました。これは、非所有とほぼ同じように動作しますが、セマンティクスT*
がわずかに異なります (および と紛らわしいほど異なりoptional<T>
ます)。T*
optional<T&>
基本的に非所有T*
であり、かなり奇妙に包まれています。
今、optional<T>
別の獣です。
optional<Iterator>
コンテナベースの検索アルゴリズムで使用しました。を返す代わりにend()
、空のオプションを返します。これにより、ユーザーはアイテムの検索に失敗したかどうかを比較せずに判断でき、次のようなコードを作成できます。
if(linear_search_for( vec, item))
動作しますが、実際に必要な場合は、同じアルゴリズムを使用して、コンテナー内のアイテムとアイテムの場所の両方を取得することもできます。
要素へのポインターは、連続したコンテナーを除いて、必要な位置情報を提供しません。
そのため、ここでは、イテレーター (一般的にさまざまな種類のコンテナーで動作する) とポインター (null 状態をテストできる) の利点を持つ null 許容イテレーターを作成しました。
次の使用は、実際に値を返すことです。長方形を計算する関数があるとします。
Rect GetRect();
今、これは素晴らしいです。しかし、質問が無意味である可能性がある場合はどうなりますか? 1 つのアプローチは、空の rect またはその他の「フラグ」値を返すことです。
Optional を使用すると、Rect を返すか何も返さないかを伝えることができ、"nothing" 状態に空の rect を使用しないことができます。戻り値を null 許容にします。
int GetValue();
はより良い例です。無効な値は int のフラグ状態を使用できますが、たとえば-1
、関数のすべてのユーザーがフラグ状態を調べて追跡し、誤って通常の状態として扱わないようにします。
代わりに、失敗する可能性があること、および失敗の状態が何であるかoptional<int> GetValue()
を明確にします。値が設定されている場合は、フラグ値ではなく、実際の値であることがわかります。
どちらの場合でも、非所有ポインターを返すことは実行できません。なぜなら、誰がストレージを所有しているのでしょうか? 無意味なヒープ割り当ては無意味であるため、所有ポインタを返すことはコストがかかります。
オプションは、null 許容値の型です。リソースをローカルで管理したいが、それでも空の状態が必要な場合は、それが明確になります。
検討すべきもう 1 つのことは、expected
提案されているタイプです。これはオプションですが、空の状態の場合、空である理由が含まれています。