2016-09-21 5 views
0

Ich habe das folgende Code-Schnipsel:C++ Stream und Operator >> Vorrang

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

Und ich versuche, die Daten wie folgt zu lesen:

stream>>key>>map[key]; 

, die als neu beschrieben werden kann:

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

beide >> und . Betreiber betrachtet haben nach rechts Assoziativität links, können Sie Plädoyer Warum wird map[key] ausgewertet, bevor key aus dem Stream gelesen wird?

Drucken der Karte:

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

Ergebnisse in:

123 
ABC 321 

Ja, es ist ein Raum vor 123

Antwort

2

Assoziativität irrelevant ist hier. Die Assoziativität bestimmt, welche Operanden an welche Operatoren gebunden sind. Es bestimmt nicht, in welcher Reihenfolge Operandenunterausdrücke ausgewertet werden. Also, wenn Sie sagen:

a >> b >> c; 

Assoziativität schreibt vor, dass die Operanden als (a >> b) >> c gruppiert sind, aber es diktiert nicht die Reihenfolge, in der die Ausdrücke a, b und c ausgewertet werden. Vor C++ 17 wurde diese Reihenfolge vom Standard nicht spezifiziert. Dies bedeutet, dass a, b und c in beliebiger Reihenfolge ausgewertet werden konnten. Seit C++ 17 ist die Reihenfolge definiert als a, dann b, dann c.

Mit anderen Worten, in Übereinstimmung ein Compiler C++ 17 drucken würde:

CBA 321 
ABC 123 

Oder umgekehrt, da der Behälter std::unordered_map ist, aber nicht wirre Worte wie die Ausgabe, die Sie zeigen.

+0

Vielleicht wäre es auch nett, eine Anmerkung zur strengen Bewertungsreihenfolge von C++ 17 hinzuzufügen. –

+0

@ PatrickM'Bongo: Ich habe damit nicht Schritt gehalten. –