2016-09-21 182 views
0

我有下面的代碼片段:C++流和運營商>>優先

std::stringstream stream("ABC 123 CBA 321"); 
std::unordered_map<std::string, int> map; 
std::string key; 

而且我想讀這樣的數據:

stream>>key>>map[key]; 

可以將它改寫爲:

operator>>(stream, key).operator>>(map[key]); 

考慮到>>.運營商有從左到右的聯想性,你能否認罪se解釋爲什麼map[key]在從流中讀取key之前進行評估?

打印地圖:

for(auto& it : map) 
{ 
    std::cout<<it.first<<" "<<it.second<<std::endl; 
} 

結果:

123 
ABC 321 

是的,有一個空間之前123

回答

2

關聯性在這裏無關緊要。關聯性決定哪些操作數綁定到哪些操作符。它不確定操作數子表達式的評估順序。所以,當你說:

a >> b >> c; 

關聯性決定了操作數被歸類爲(a >> b) >> c,但它並沒有規定在其中表達的a,b和c的計算順序。在C++ 17之前,標準沒有指定該順序:這意味着a,b和c可以按任何順序進行評估。自C++ 17以來,順序被定義爲a,然後b,然後c。

換句話說,編譯器符合C++ 17將打印:

CBA 321 
ABC 123 

還是其他方式,由於容器是std::unordered_map,但不是像你顯示輸出混亂的話。

+0

也許在C++ 17的嚴格評估順序上添加註釋也會很好。 –

+0

@ PatrickM'Bongo:我沒有跟上。 –