2016-09-21 106 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:我没有跟上。 –