2013-06-29 10 views
5

boost::optionalの動作についていくつか質問があります。まずはこれを実行してみましょう:boost :: optionalの比較(<)、出力(<<)と代入(=)

boost::optional<int> i; 
  1. は常に*i < 3と同等(および他の関係演算子についても同様)i < 3ですか?
  2. i < 3*i < 3の条件が定義されていないのは正しいですか? (iは何も設定されていません)
  3. std::cout << iとは何ですか?
  4. i = 3は常に*i = 3と同じです。もしそうなら、どちらを好むべきですか?
+1

'i.get()'はあなたの仲間です。 –

+1

は、後半のバージョンでドキュメントを削除しましたか? –

答えて

9
  1. iが初期化されていない場合は、第二アサートする一方、最初は真を返します。
  2. いいえ。operator<のドキュメントでは、lefthand引数が初期化されていない場合は、右側のオペランドが設定されているときにtrueを返します。
  3. optionalにはoperator<<が存在しませんので、unspecified-bool-typeの変換と1または0(true/false)を返します。
  4. これらは同じではありません。 iが初期化されていない場合、後者はアサートされ、前者は初期化および割り当てを行います。あなたは、あなたが望むセマンティクスを示すものを使うべきです。ポイント3について
4

は、ありオペレータのブースト/オプション/ optional_io.hppで宣言されたブースト::オプションについて< <、しかし、あなたはおそらくそれを含めていません。 (もしboost_typeを使用した場合、それはあなたのために追加されます)。もしそれが含まれていれば、空のオプションは " - "としてストリーミングされ、追加されたオプションは余分なスペース文字をストリームしてから値をストリームします。

ので、このコード:

#include <boost/optional/optional_io.hpp> 
boost::optional<string> var1 = "value"; 
boost::optional<string> var2; 
cout << " var1 = '" << var1 << "'\n"; 
cout << "*var1 = '" << *var1 << "'\n"; 
cout << " var2 = '" << var2 << "'\n"; 

は、この得られます

var1 = ' value' 
*var1 = 'value' 
var2 = '--' 

が、含ま利回りなしで同じコードこのマークBの答えによって示唆されているように:

var1 = '1' 
*var1 = 'value' 
var2 = '0' 

こと最初のケースで余分なスペースが私に混乱を引き起こしました。

関連する問題