Wenn Sie folgenden Code:Kann ich Vektor von Tupel von Referenzen sortieren?
std::vector<std::tuple<int&>> v;
int a = 5; v.emplace_back(a);
int b = 4; v.emplace_back(b);
int c = 3; v.emplace_back(c);
int d = 2; v.emplace_back(d);
int e = 1; v.emplace_back(e);
std::sort(std::begin(v), std::end(v));
mit gcc/libstdC++ kompiliert vs Klirren/libC++ binäre unterschiedliche Ergebnisse liefert.
Für gcc/libstdc++ wird ein Element auf alle anderen Referenzen kopiert.
5 4 3 2 1
5 5 5 5 5
Zuerst dachte ich, dass clang/libc++verhält sich wie erwartet, aber es funktioniert nur in einem Vektor zu 5 Elementen bis (denn es gibt einen Sonderfall für kleinen Behälter ist).
5 4 3 2 1
1 2 3 4 5
Bei der Weiterleitung mehrerer Elemente ähnelt das Ergebnis gcc.
5 4 3 2 1 0
3 4 5 5 5 5
So ist es gültig std::sort
für Behälter von Tupeln mit Referenzen zu verwenden (das heißt mit std::tie
gemacht, Teilmenge von struct Sortierung)? Wenn nicht, sollte ich irgendwelche Warnungen erwarten?
Die Verwendung von 'std :: reference_wrapper' funktioniert, weil es aus 'std :: tie' konstruiert werden kann, aber einige Template-Magie benötigt, um T & ... type list zu bekommen und mit reference_wrapper zu dekorieren. zustimmen [Beiden Compiler] (http://melpon.org/wandbox/permlink/atQyUIr1Bh5g6qgn), dass 'std :: tuple ' is_move_assignable && is_move_constructible (mit den Standardmerkmalen) –
@KarolWozniak Das Merkmal nur dann, wenn die tatsächlichen überprüfen semantische Werke - Sie * können * bewegen zuweisen ein 'Tupel'. Es hat einfach nicht das tatsächliche Verhalten, das diese Operation haben muss, um als MoveAssignable zu gelten. –
Barry
@KarolWozniak Zum Beispiel 'struct X {int val; X & operator = (X &&) {return * this; }; '' is_move_assignable 'ist wahr, aber' X' ist nicht wirklich MoveAssignable, da die Anforderung nicht erfüllt ist. –
Barry