の4つのバリエーションがあるべきだと私には思えますboost::optional
optional<Foo>
=> 変更可能な Foo を保持し、初期化後に再割り当てできますoptional<Foo const> const
=> const Foo を保持し、初期化後に再割り当てできませんoptional<Foo> const
=> (すべき?) 変更可能な Foo を保持しますが、初期化後に再割り当てすることはできませんoptional<Foo const>
=> (すべき?) const Foo を保持し、初期化後に再割り当てできます
最初の 2 つのケースは期待どおりに機能します。ただし、optional<Foo> const
const Foo への逆参照、および初期化後の再割り当ては許可されません (この質問optional<Foo const>
で触れたように)。
const 値型の再割り当ては、特に私が遭遇したものであり、エラーは次のとおりです。
/usr/include/boost/optional/optional.hpp:486: エラー: 'Foo& Foo::operator=(const Foo&)' の 'this' 引数として 'const Foo' を渡すと修飾子が破棄されます [-fpermissive]
そして、それはここで起こります:
void assign_value(argument_type val,is_not_reference_tag) { get_impl() = val; }
構築後、実装は、optional をパラメーター化した型の代入演算子を使用します。明らかに、定数値である左側のオペランドは必要ありません。しかし、次の場合のように、非 const オプションを新しい const 値にリセットできないのはなぜですか。
optional<Foo const> theFoo (maybeGetFoo());
while (someCondition) {
// do some work involving calling some methods on theFoo
// ...but they should only be const ones
theFoo = maybeGetFoo();
}
いくつかの質問:
これを望むことは概念的には問題なく、それができないのは実装のまぐれにすぎないというのは正しいですか?
ブースト ソースを編集しない場合、boost::optional を完全に破棄せずに上記のループのようなロジックを実装するクリーンな方法は何でしょうか?
これが理にかなっていて、boost::optional ソースを編集する必要がある場合 (可動タイプをサポートするために既に実行しなければなりませんでしたが、すぐに自分でそれを行うと思われます)、最小限の侵襲的な変更を行う可能性がありますトリックをしますか?