[英]Difference between boost optional and std::experimental optional assignment
[英]Comparison (<), output (<<) and assignment (=) for boost::optional
我有一些關於boost::optional
如何工作的問題。 我們先來這樣做:
boost::optional<int> i;
i < 3
總是等於*i < 3
(和其他關系運算符類似)? i < 3
和*i < 3
未定義是否正確? ( i
還沒有做任何事情) std::cout << i
應該打印? i = 3
總是與*i = 3
相同。 如果是這樣,我應該選擇哪個? i
未初始化,第一個將返回true而第二個將斷言。 operator<
的文檔operator<
清楚地表明如果左手參數未初始化,則在設置右手操作數時它將返回true
。 operator<<
for optional
所以我假設它將返回unspecified-bool-type
轉換並打印1或0(true / false)。 i
未初始化,后者將斷言,而前者將初始化並分配。 您應該使用指示您所需語義的那個。 關於第3點, 有一個運營商<<升壓::可選在升壓/可選/ optional_io.hpp聲明,但你可能不包括。 (如果碰巧使用boost property_tree,它會被包含在內。)如果包含它,則一個空的可選項將作為“ - ”流,並且一個填充的可選項將流出一個額外的空格字符,然后流式傳輸該值。
所以這段代碼:
#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 = '--'
但是沒有包含相同的代碼會產生這種情況,正如Mark B的回答所示:
var1 = '1'
*var1 = 'value'
var2 = '0'
第一種情況下的額外空間給我帶來了一些困惑。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.