Warum kann ich nicht machen, ein Vektor, der Referenzen?
Wenn ich dies tun:
std::vector<int> hello;
Alles Super funktioniert. Allerdings, wenn ich es ein Vektor, der Referenzen statt:
std::vector<int &> hello;
Bekomme ich schreckliche Fehler wie
Fehler C2528: "Cursor": Zeiger, Referenz ist illegal
Möchte ich eine Reihe von Bezügen zu Strukturen, in einen Vektor, so dass ich nicht haben, um dich mit Zeigern. Warum ist der Vektor werfen einen Wutanfall über diese? Ist meine einzige option, um eine Vektor von Zeigern statt?
Sie können die Verwendung von std::vector<reference_wrapper<int> > Hallo; Siehe informit.com/guides/content.aspx?g=cplusplus&seqNum=217
der link ist nicht mehr gültig, offizielle Dokumentation hier
der link ist nicht mehr gültig, offizielle Dokumentation hier
InformationsquelleAutor Colen | 2009-05-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Komponente Typ der Container, wie Vektoren müssen zuweisbare. Referenzen sind nicht übertragbar (Sie können nur initialisieren Sie einmal, wenn Sie deklariert sind, und Sie können nicht machen Sie zu verweisen, etwas anderes später). Andere nicht-zuweisbaren Typen sind auch nicht erlaubt, da Komponenten von Containern, z.B.
vector<const int>
ist nicht erlaubt.Ja, ein std::vector< std::vector<int> > richtig ist, std::vector ist belegbar.
In der Tat, dies ist der "eigentliche" Grund. Der Fehler über die T* wird nicht von T ist U& ist einfach ein Nebeneffekt der Verletzten Vorschrift, dass T müssen zuweisbar. Wenn der Vektor in der Lage war, genau zu prüfen, die Art-parameter, dann würde es wahrscheinlich sagen, "verletzt Anforderung: T& nicht zuweisbar"
Die überprüfung der assignable-Konzept auf der boost.org/doc/libs/1_39_0/doc/html/Assignable.html alle Operationen, mit Ausnahme der swap-gültig auf Referenzen.
Das ist nicht mehr wahr. Seit C++11, die nur-Bedienung-unabhängige Voraussetzung für element "Löschbar", und der Verweis nicht. Siehe stackoverflow.com/questions/33144419/....
InformationsquelleAutor newacct
ja, Sie können, look für
std::reference_wrapper
, nachahmt, ein Hinweis, aber ist belegbar und kann auch "reseated"get()
erste beim Zugriff auf eine Methode einer Instanz einer Klasse, in der dieser wrapper? E. g.reference_wrapper<MyClass> my_ref(...); my_ref.get().doStuff();
ist nicht ganz Referenz, wie.Ist es nicht implcitly Gießmasse auf die Art selbst wird-durch Rücksendung der Referenz?
Ja, aber das erfordert einen Kontext, der impliziert, das eine Konvertierung erforderlich ist. Member-Zugang macht das nicht, daher die Notwendigkeit für
.get()
. Was timdiels will, istoperator.
; haben Sie einen Blick auf die neuesten Vorschläge/Diskussionen dazu.InformationsquelleAutor Ion Todirel
Durch Ihre Natur, Verweise nur auf die Zeit, so werden Sie geschaffen, d.h., die beiden folgenden Zeilen haben sehr unterschiedliche Auswirkungen:
Weiter, das ist illegal:
Jedoch, wenn Sie einen Vektor erstellen, es gibt keine Möglichkeit, Werte zuzuweisen, ist es Objekte zu schaffen. Sie sind im wesentlichen nur einem ganzen Haufen von dem letzten Beispiel.
Das element YP des std::vector<T> ist nicht erforderlich, um Standard-baubar. Sie können schreiben, struct A { A(int); private: A(); }; vector<A> a; Prima - so lange, wie Sie nicht verwenden solche Methoden, die es erfordern, werden Standard-baubar (wie v. resize(100); - aber statt das Sie tun müssen, v. resize(100, (1)); )
Und wie würden Sie schreiben, wie eine push_back() in diesem Fall? Es wird weiterhin Aufgabe, nicht Konstruktion.
James Curran, Keine Standard-Konstruktion die dort stattfindet. push_back nur Platzierung-news Ein in das fest zugewiesene Puffer. Siehe hier: stackoverflow.com/questions/672352/... . Beachten Sie, dass meine behaupten, ist nur, dass Vektor umgehen kann die nicht-Standard-baubar-Typen. Ich behaupte nicht, natürlich, dass Sie es verkraften konnte T& (kann es nicht, natürlich).
InformationsquelleAutor James Curran
Ionen Todirel schon erwähnt eine Antwort JA mit
std::reference_wrapper
. Seit C++11 wir haben einen Mechanismus zum abrufen eines Objekts ausstd::vector
und entfernen Sie den Verweis, indem Sie mitstd::remove_reference
. Unten ist ein Beispiel zusammengestellt, mitg++
undclang
mit option-std=c++11
und erfolgreich ausgeführt.std::remove_reference<>
hier. Der Punkt, derstd::remove_reference<>
ist es, zu schreiben "der Typ "T", aber ohne einen Verweis, wenn es eins ist". Sostd::remove_reference<MyClass&>::type
ist genau das gleiche wie das schreibenMyClass
.Nicht Wert überhaupt - Sie können einfach schreiben,
for (MyClass obj3 : vec) std::cout << obj3.getval() << "\n";
(oderfor (const MyClass& obj3: vec)
wenn Sie erklärengetval()
const, als Sie sollten).InformationsquelleAutor Steephen
boost::ptr_vector<int>
arbeiten.Edit: war ein Vorschlag,
std::vector< boost::ref<int> >
, das wird nicht funktionieren, weil Sie nicht Standard-Konstrukt eineboost::ref
.Oder
resize
.Seien Sie vorsichtig, Steigern Sie den Zeiger Behälter nehmen ausschließliche Eigentum des pointees. Zitieren: "Wenn Sie das tun, müssen gemeinsame Semantik, die diese Bibliothek ist nicht, was Sie brauchen."
InformationsquelleAutor Drew Dormann
Es ist ein Fehler in der C++ - Sprache. Sie können nicht nehmen Sie die Adresse einer Referenz, da der Versuch zu tun, so würde das Ergebnis in die Adresse des Objekts Bezug genommen wird, und somit kann man nie einen Zeiger auf eine Referenz.
std::vector
arbeitet mit Zeiger auf seine Elemente, also die Werte, die gespeichert werden können, müssen Sie hingewiesen werden. Sie haben die Verwendung von Zeigern statt."Fehler in der Sprache" ist zu stark. Es ist by design. Ich glaube nicht, dass es erforderlich ist, dass die vector arbeitet mit Zeiger auf Elemente. Es ist jedoch erforderlich, dass das element zuordenbar sein. Referenzen sind nicht.
Sie können nicht nehmen Sie die
sizeof
einem Verweis.Sie brauchen nicht einen Zeiger auf eine Referenz, haben Sie die Referenz, wenn Sie wollen, brauchen Sie die Zeiger, nur die Zeiger selbst; es ist kein problem hier gelöst werden
InformationsquelleAutor Adam Rosenfield
Wie andere erwähnt haben, werden Sie wahrscheinlich am Ende mit einem Vektor von Zeigern statt.
Allerdings möchten Sie vielleicht zu prüfen, mit einem ptr_vector statt!
InformationsquelleAutor Martin Cote
Als die anderen Kommentare deuten darauf hin, Sie sind beschränkt auf die Verwendung von Zeigern.
Aber wenn es hilft, hier ist eine Technik, um zu vermeiden, vor, direkt mit Zeigern.
Können Sie etwas wie die folgende:
reinterpret_cast
ist nicht erforderlichWie die anderen Antworten zeigen, wir sind nicht allein mit Zeigern auf alle.
InformationsquelleAutor Omid
TL; DR
Verwenden
std::reference_wrapper
wie diese:Demo
Lange Antwort
Als standard schlägt, für einen standard-container
X
mit Objekten vom TypT
,T
mussErasable
ausX
.Erasable
bedeutet, dass der folgende Ausdruck ist wohlgeformt:A
ist container-Zuweisung geben,m
ist die Zuweisung Instanz undp
ist ein Zeiger vom Typ*T
. Sehen hier fürErasable
definition.Standardmäßig
std::allocator<T>
ist als vector-Zuweisung. Mit der default-Zuweisung ist die Bedingung äquivalent zu der Gültigkeit vonp->~T()
(Hinweis: dieT
ist ein Referenz-Typ und derp
ist Zeiger auf eine Referenz). Allerdings Zeiger auf eine Referenz ist illegal, daher der Ausdruck nicht wohlgeformt.InformationsquelleAutor ivaigult