通常、関数がboost::optional
を返すとき空の値を指定するために空のブレース{}
を返す人がたくさんいますが、これは正常に動作し、boost::none
を返すよりも短いです。boostオプションとstd :: experimentalのオプション割り当ての違い
私はboost::optional<int>
を空にするのと同様のことを試みましたが、コピー代入演算子(またはほとんどの場合は移動代入演算子)を右側の空のブレースで呼び出すと、空のブレースはintに変換されてからその値はオプションに割り当てられているので、私は期待していた変数を0に設定し、空の値にはしません。ここではhttps://godbolt.org/g/HiF92vの例があります。std::experimental::optional
で同じことを試してみたら、期待通りの結果が得られます(この例ではstd :: experimental :: optionalを置き換えれば、命令はmov eax, eax
になります)。
boostオプション(非整数型)の別のテンプレート引数を使用すると、一部のコンパイラがコンパイルされます(私が期待している動作、ここでの例はhttp://cpp.sh/5j7n)。したがって、同じlibの場合でも、テンプレートargに応じて動作が異なります。
私はここで何が起こっているのか理解したいと思っています。私はそれがデザインに考慮されていないライブラリにC++ 14の機能を使用しているということとは関係があります。私はboost/optional
ヘッダーを読んだが、細部に迷ってしまった。同様の結果でインライン展開せずにコンパイル済みコードを調べようとした。
私は、-std = C++ 14でgcc 4.9.2を使用し、1.57をブーストしています。
btw:私はboost::optional::reset
またはboost::none
を使用していたはずですが、コードベースの残りのセマンティクスと一貫性を保ちようとしていました。
割り当てと初期化の違いは... – aschepler
はい、確かに問題は、boost :: optionalとstd :: experimental :: optionalの割り当てが異なる理由と、boost :: optionalの理由です非整数型の場合 – dlavila
基本的に、 'std :: experimental :: optional'は、' o = {} 'が常にそれをリセットするような特別なやり方をしています。 'boost :: optional'にはそのようなトリックはありません。 –