2016-09-21 2 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, но не определяет порядок, в котором выражение а, б и оценены. До 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: Я не справился с этим. –

Смежные вопросы