2017-10-16 2 views
0

Im Allgemeinen können STL-Container keine CopyAssignable Typen wie Referenzen enthalten. Wenn ich den Container so konstruiere, dass keine Kopie stattfinden soll, ist der Code gültig. Es kompiliert mit std=c++11 und c++14 mit einer Version von gcc-7.2, aber ist das folgende gültig oder kann ich erwarten, dass es mit einem Bibliotheksupgrade bricht? Sollte ich in diesem Fall reference_wrapper verwenden?Ist es legal, eine unordered_map zu erstellen, die Referenzen enthält?

#include <unordered_map> 

struct S {}; 

void use (S&) {} 

void test() { 
    S s1, s2; 
    const std::unordered_map<int, S&> m{{0, s1}, {1, s2}}; 
    use(m.at(0)); 
} 

bearbeiten ich brauche wirklich einen Verweis auf den Standard. Auch für mich ist es nicht genug, wenn ein standardkonformes Update der Compiler/Standard-Bibliothek den Code durchbrechen kann. Also reicht die Antwort für "unordered_map with reference as value" nicht für mich.

+4

Mögliches Duplikat von [unordered \ _map mit Referenz als Wert] (https://stackoverflow.com/questions/24719044/unordered-map-with-reference-as-value) – davidhigh

+0

im Allgemeinen erfordern Container CopyAssignable nicht nur für die Konstruktion , aber auch viele Algorithmen funktionieren möglicherweise nicht wie erwartet – user463035818

Antwort

1

Ich denke, dass ich eine Antwort mich für diesen speziellen Anwendungsfall gefunden:

Der C++11 Standard bei Klausel 23.5.4.3 für unordered_map Element Zugriff ausdrücklich jegliche Anforderungen an die mapped_type auslässt Auflistung, dh S&, während mit operator[] es muss DefaultConstructible sein.

mapped_type& at(const key_type& k); 
const mapped_type& at(const key_type& k) const; 

Returns: Ein Verweis auf x.second, wo x ist die (eindeutige) Element, dessen Schlüssel entspricht k.

Wirf: Ein Ausnahmeobjekt vom Typ out_of_range, wenn kein solches Element vorhanden ist.

C++17 sagt indirekt auch etwas in diesem Sinne in 26.5.4.3 und 26.5.4.4.

Daher sollte der obige Code mit jeder Standardimplementierung arbeiten.

jedoch, es ist wahr - wie in den Kommentaren darauf hingewiesen -, dass der Behälter nach dem Bau mutiert oder einen Algorithmus anwenden, dass der Behälter des value_type oder mapped_type Bau oder Zuweisung erfordert wird nicht funktionieren.

Verwandte Themen