totally_ordered_wrapper Class

template <typename P> class Qt::totally_ordered_wrapper

Qt::totally_ordered_wrapper ist ein Wrapper-Typ, der eine strenge Gesamtreihenfolge für die umhüllten Typen bietet. Mehr...

Kopfzeile: #include <QtCompare>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
Seit: Qt 6.8

Detaillierte Beschreibung

Einer der Hauptanwendungsfälle ist die Verhinderung von Undefined Behavior (UB) beim Vergleich von Zeigern.

Betrachten Sie die folgende einfache Klasse:

template <typename T>
struct PointerWrapperBad {
    int val;
    T *ptr;
};

Ein lexikographischer Vergleich der beiden Instanzen des Typs PointerWrapperBad würde zu UB führen, da er operator<() oder operator<=>() auf den ptr Membern aufrufen würde.

Um dies zu beheben, verwenden Sie den neuen Wrapper-Typ:

template <typename T>
struct PointerWrapperGood {
    int val;
    Qt::totally_ordered_wrapper<T *> ptr;

    friend bool
    operator==(PointerWrapperGood lhs, PointerWrapperGood rhs) noexcept = default;
    friend auto
    operator<=>(PointerWrapperGood lhs, PointerWrapperGood rhs) noexecpt = default;
};

Die Operatoren operator<() und (falls vorhanden) operator<=>() für den Typ Qt::totally_ordered_wrapper verwenden die Funktionsobjekte std::less bzw. std::compare_three_way, die beim Vergleich eine strikte Gesamtreihenfolge über Zeiger gewährleisten.

Infolgedessen sind die relationalen Operatoren für die Mitglieder von PointerWrapperGood::ptr wohldefiniert, und wir können sogar =default die relationalen Operatoren für die Klasse PointerWrapperGood verwenden, wie es oben gezeigt wird.

© 2025 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.