2012-03-28 5 views
2

nehme ich habe folgendes:Zuordnung und Referenz Initialisierung von einem temporären

boost::unordered_map< string , someValueType > map; 
someValueType& value = map[ "key" ] = someValueType(); 

die letzte Zeile enthält:

  • eine temporäre konstruiert Instanz someValueType
  • eine Zuweisung der temporären in eine neuer Karteneintrag
  • Initialisierung eines Verweises auf den Karteneintrag

also, wenn nächste Zeile ist:

value.someProperty = 42; 

dies wird versuchen, die Karte Eintrag rechts zu ändern? nicht das ursprüngliche temporäre?

Ich weiß in diesem Fall, wenn die Referenz ein temporäres nicht dauern konnte, weil es nicht const ist (so ein Compiler-Fehler oder die Abwesenheit von einem würde meine Frage beantworten), aber wenn ich das const zur Referenzdeklaration hinzufüge, Ich bin mir nicht sicher, was die Bewertungsregeln in diesem Fall sagen würden

Antwort

4

Das stimmt. Sie haben eine Initialisierung mit einem Zuweisungsausdruck auf der rechten Seite:

someValueType & value = (map["key"] = someValueType()); 

In der Tat ist dies gleichbedeutend mit:

someValueType & value = map["key"]; 

Dies liegt daran, das [] -Operator ein neues Element erzeugt, wenn man nicht tut existiert bereits für diesen Schlüssel.

Das Binden des Karteneintrags an eine Konstante const macht keinen Unterschied. Allerdings, wenn Sie wissen, dass der Schlüssel ist garantiert existieren, dann können Sie eine konstante Referenz auf den zugeordneten Wert binden, auch wenn Sie nur einen konstanten Verweis auf die Karte selbst haben:

void (MapType const & m) 
{ 
    someValueType const & = m.find("key")->second; 
} 

Dies wäre ein Fehler von Natürlich, wenn der Schlüssel nicht existiert, da Sie den End-Iterator dereferenzieren würden.

+0

Dank Kerrek, gibt es eine Möglichkeit, ein neues Element in der Karte ohne das temporäre zu erstellen? etwas wie emplace Initialisierung? – lurscher

+0

@lurscher: [Ja] (http://en.cppreference.com/w/cpp/container/unordered_map/emplace), aber kein Compiler, den ich kenne, unterstützt es noch. (Alle assoziativen Container haben 'emplace' im neuen Standard.) –

+0

@Irfy: Ich meinte nur, dass ich keinen Compiler + Bibliothek kenne, der an dieser Stelle die Assoziative-Map-Einordnung implementiert. Es ist im Standard, also wird es kommen, aber praktisch ist es noch nicht weit verbreitet. –

Verwandte Themen