<QtTypeTraits> - Qt Type Traits
Funktionalität für Typmerkmale und Transformationen. Mehr...
| Header: | #include <QtTypeTraits> |
| Since: | Qt 6.5 |
Funktionen
| T | qExchange(T &obj, U &&newValue) |
(since 6.2) std::underlying_type_t<Enum> | qToUnderlying(Enum e) |
Makros
(since 6.8) | QT_NO_QASCONST |
(since 6.6) | QT_NO_QEXCHANGE |
Funktionsdokumentation
[constexpr noexcept(...)] template <typename T, typename U = T> T qExchange(T &obj, U &&newValue)
Ersetzt den Wert von „ obj “ durch „ newValue “ und gibt den alten Wert von „ obj “ zurück.
Dies ist die Qt-Implementierung von `std::exchange()`. Sie unterscheidet sich von `std::exchange()` lediglich dadurch, dass sie bereits vor C++20 ` constexpr ` und bereits vor C++23 `noexcept` ist.
Wir empfehlen dringend, std::exchange() zu verwenden, wenn Sie die Varianten aus C++20 oder C++23 nicht benötigen. Sie können qExchange() deaktivieren, indem Sie das Makro „ QT_NO_QEXCHANGE “ definieren.
So verwenden Sie `qExchange()`, um Move-Konstruktoren zu implementieren:
MyClass(MyClass &&other)
: m_pointer{qExchange(other.m_pointer, nullptr)},
m_int{qExchange(other.m_int, 0)},
m_vector{std::move(other.m_vector)},
...Für Mitglieder vom Typ „Klasse“ können wir `std::move()` verwenden, da deren Move-Konstruktor das Richtige tut. Bei skalaren Typen wie rohen Zeigern oder Ganzzahltypen entspricht ein Move jedoch einer Kopie, was insbesondere bei Zeigern nicht unseren Erwartungen entspricht. Daher können wir für solche Typen nicht std::move() verwenden, sondern müssen std::exchange()/qExchange() nutzen, um sicherzustellen, dass das Element des Quellobjekts bereits zurückgesetzt ist, wenn wir zur Initialisierung unseres nächsten Datenelements gelangen – was nützlich sein kann, falls der Konstruktor mit einer Ausnahme beendet wird.
So verwendet man `qExchange()`, um eine Schleife zu schreiben, die die durchlaufene Sammlung aufbraucht:
for (auto &e : qExchange(collection, {})
doSomethingWith(e);Dies entspricht dem folgenden, wesentlich ausführlicheren Code:
{
auto tmp = std::move(collection);
collection = {}; // or collection.clear()
for (auto &e : tmp)
doSomethingWith(e);
} // destroys 'tmp'Dies ist vollkommen sicher, da die for-Schleife das Ergebnis von `qExchange()` so lange aufrechterhält, wie die Schleife läuft, wodurch die Deklaration einer temporären Variablen entfällt. Beachten Sie jedoch, dass `qExchange()` ein nicht-konstantes Objekt zurückgibt, sodass sich Qt-Container möglicherweise lösen können.
Hinweis: Diese Funktion ist „noexcept“, wenn „ std::conjunction_v<std::is_nothrow_move_constructible<T>,
std::is_nothrow_assignable<T &, U>> “ auf „ true “ gesetzt ist.
[constexpr noexcept, since 6.2] template <typename Enum> std::underlying_type_t<Enum> qToUnderlying(Enum e)
Konvertiert das Enumerator- e in den entsprechenden Wert, ausgedrückt im zugrunde liegenden Typ der Enumeration.
Diese Funktion wurde in Qt 6.2 eingeführt.
Makro-Dokumentation
[since 6.8] QT_NO_QASCONST
Durch die Definition dieses Makros wird die Funktion qAsConst() deaktiviert.
Dieses Makro wurde in Qt 6.8 eingeführt.
Siehe auch qAsConst.
[since 6.6] QT_NO_QEXCHANGE
Durch die Definition dieses Makros wird die Funktion „ qExchange()“ deaktiviert.
Dieses Makro wurde in Qt 6.6 eingeführt.
Siehe auch qExchange.
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.