totally_ordered_wrapper Class
template <typename P> class Qt::totally_ordered_wrapperQt::totally_ordered_wrapper はラッパー型であり、ラップされた型の厳密な全順序を提供する。詳細...
Header: | #include <QtCompare> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake: | QT += core |
Since: | Qt 6.8 |
詳しい説明
この型の主な使用例の1つは、ポインタを比較する際の未定義の振る舞い(UB)を防ぐことです。
次のような単純なクラスを考えてみましょう:
template <typename T> struct PointerWrapperBad { int val; T *ptr; };
PointerWrapperBad
型の2つのインスタンスをレキシカルに比較すると、ptr
メンバ上でoperator<()
またはoperator<=>()
を呼び出すため、UBが発生します。
これを修正するには、新しいラッパー型を使います:
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; };
Qt::totally_ordered_wrapper
型のoperator<()
演算子および(利用可能な場合)operator<=>()
演算子は、それぞれstd::lessおよびstd::compare_three_way関数オブジェクトを使用し、比較時にポインタに対する厳密な全順序を提供します。
その結果、PointerWrapperGood::ptr
メンバの関係演算子はきちんと定義され、上に示したように、PointerWrapperGood
クラスの関係演算子=default
を使うこともできる。
本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。