C ++流和运算符>>优先权

时间:2016-09-21 07:48:18

标签: c++ operators iostream

我有以下代码段:

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]);

考虑到>>.运算符都有从左到右的关联性,您能否解释为什么map[key]在从流中读取key之前进行评估?

打印地图:

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

结果:

 123
ABC 321

是的,123

之前有一个空格

1 个答案:

答案 0 :(得分: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,而不是像您显示的输出那样混乱的单词。