10

通常、関数が返されるとき、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::resetorを使用する必要がboost::noneあることはわかっていましたが、残りのコード ベースのセマンティクスと一致するように努めていました。

4

1 に答える 1