通常、関数が返されるとき、boost::optional
多くの人が空のブレースを返して空の値を指定するのを見てきました。これは正常に機能し、 を返す{}
よりも短くなりboost::none
ます。
空の a に似たようなことをしようとしましたboost::optional<int>
が、右側に空のブレースを付けてコピー代入演算子 (またはおそらくムーブ代入 op) を呼び出すと、空のブレースが int に変換され、その値がに割り当てられますオプションなので、期待していたように空の値ではなく、変数が 0 に設定されます。ここに例があります https://godbolt.org/g/HiF92v、同じことを試してみると、std::experimental::optional
期待どおりの結果が得られます(例で std::experimental::optional に置き換えるだけで、命令が表示されますになりますmov eax, eax
)。
また、boost オプション (非整数型) の別のテンプレート引数を試してみると、一部のコンパイラはコンパイルされます (私が期待している動作で、ここの例http://cpp.sh/5j7n )。他のコンパイラはコンパイルしません。したがって、同じライブラリでも、テンプレートの引数によって動作が異なります。
ここで何が起こっているのかを理解したいのですが、それが設計に考慮されていないライブラリに C++14 機能を使用しているという事実と関係があることはわかっています。ヘッダーを読みましたboost/optional
が、詳細に迷いました。また、コンパイルされたコードをインライン化せずに調査しようとしましたが、同様の結果が得られました。
-std=c++14 およびブースト 1.57 で gcc 4.9.2 を使用しています。
ところで: boost::optional::reset
orを使用する必要がboost::none
あることはわかっていましたが、残りのコード ベースのセマンティクスと一致するように努めていました。