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

C++ stream and operator>> precedence

本文关键字:gt 优先级 运算符 C++      更新时间:2023-10-16

我有以下代码片段:

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

前面有一个空格

结合性与此无关。结合性决定哪些操作数与哪些操作符绑定。它不确定以何种顺序计算操作数子表达式。所以当你说:

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,而不是像您显示的输出那样的混乱的单词。