はすでに専門分野であるためboost::optional<T&>
、ラッパーとして実装されていないのはなぜT*
ですか?m_initialized
これにより、ブール値が不要になるため、占有するスペースが少なくなります。
3 に答える
boost 1.61以降のオプションは、参照の場合に最適化されています。
リリースノートには次のように記載されています。
sizeof(optional<T&>) == sizeof(T*)
したがって、その場合は確かにポインターとして実装されます。
これはおそらく、初期化されていないオブジェクトが で初期化されたboost::optional<T*>
ものと区別されなければならないためです。たとえば、この関数は値を返さないか、 aまたは非ポインタを返すことができます。boost::optional<T*>
NULL
NULL
NULL
NULL
この場合、値を示さない単純なポインターを使用しないのはなぜですか。を使用して、さらに複雑にする必要はありませんboost::optional<>
。つまり、物事を大きくしたり複雑にしたりするのは簡単ですが、より良くするのは難しいということです。
まず、boost::optional<T&>
専門分野ではありません。コードを見ると、タグベースのディスパッチを行って参照型の動作をカスタマイズしていることがわかりますが、boost::optional_base<T>
クラス テンプレート自体は特殊化されていません。
ただし、このスペースの最適化が実装されていない理由については、依然として正当な疑問です。専門的でないからか、その分大変な仕事なのかはわかりません。
生のポインターよりも優先する理由についての質問optional<T&>
は、まったく別のものですので、お気軽に個別に質問してください...