QVector
erfordert Elemente zuweisbare Datentypen , was bedeutet sie
muss einen Standardkonstruktor, einen Kopierkonstruktor und eine Zuweisung bereitstellen Betreiber.
Ihre Version von append erzwingt alle, während Ihre Version Konstruktion nicht erzwingen erzwingt, wenn QTypeInfo<T>::isComplex
falsch und optimiert weg ist.
Hinweis: QTypeInfo<T>::isComplex
wird zur Kompilierzeit aufgelöst.
Ich vermute, dass es sich um eine Legacy-Anforderung handelt, da QVector bereits in Qt2 existiert , deren Datum von% stammt. co_de% lange vor C ++ Standardisierung.
Ich kann mir zwei mögliche Gründe vorstellen.
Es folgt der Stil des Rests der STL, kopieren und tauschen und übergeben durch const & amp ;. Keine von diesen macht in dieser Situation eine gute Leistung oder eine korrekte Richtigkeit; aber es hält den Stil konsistent.
Da der Parameter an eine Referenz gebunden ist, vermeidet er die Eliminierung der Kopie beim Funktionsaufruf. Und weil die Elemente in einem Vektor zuweisbar sein müssen (dh nicht const), vermeidet es die Elision bei der Zuweisung in den Vektor
Dies macht den Code VIEL über Compiler portabler und konsistenter. Das ist wahrscheinlich eine große Sache für die STL.
Elision-Wikipedia-Eintrag kopieren
31) Wenn bestimmte Kriterien erfüllt sind, darf eine Implementierung den Kopier- / Verschiebungsaufbau eines Klassenobjekts auslassen, selbst wenn der Kopier- / Verschiebungskonstruktor und / oder der Destruktor für das Objekt Nebenwirkungen haben. In solchen Fällen behandelt die Implementierung die Quelle und das Ziel der ausgelassenen Kopier- / Verschiebungsoperation als einfach zwei verschiedene Arten, auf dasselbe Objekt zu verweisen, und die Zerstörung dieses Objekts erfolgt zu dem späteren Zeitpunkt, zu dem die beiden Objekte gewesen wären Ohne die Optimierung zerstört.123 Diese Eliminierung von Kopier- / Verschiebeoperationen, die als Kopier-Elision bezeichnet wird, ist unter den folgenden Umständen zulässig (die kombiniert werden können, um mehrere Kopien zu eliminieren):
- wenn ein temporäres Klassenobjekt nicht an eine Referenz gebunden ist (12.2) würde mit demselben in ein Klassenobjekt kopiert / verschoben werden cv-unqualified type, kann der Kopier- / Verschiebevorgang weggelassen werden Konstruieren des temporären Objekts direkt in das Ziel der ausgelassen kopieren / verschieben