名前空間
変種
操作

std::totally_ordered, std::totally_ordered_with

From cppreference.com
< cpp‎ | concepts
 
 
 
ヘッダ <concepts> で定義
template< class T >

concept totally_ordered =

    std::equality_comparable<T> && __PartiallyOrderedWith<T, T>;
(1) (C++20以降)
template< class T, class U >

concept totally_ordered_with =
    std::totally_ordered<T> &&
    std::totally_ordered<U> &&
    std::equality_comparable_with<T, U> &&
    std::totally_ordered<
        std::common_reference_t<
            const std::remove_reference_t<T>&,
            const std::remove_reference_t<U>&>> &&

    __PartiallyOrderedWith<T, U>;
(2) (C++20以降)
ヘルパーコンセプト
template< class T, class U >

concept __PartiallyOrderedWith =
    requires(const std::remove_reference_t<T>& t,
             const std::remove_reference_t<U>& u) {
        { t <  u } -> boolean-testable;
        { t >  u } -> boolean-testable;
        { t <= u } -> boolean-testable;
        { t >= u } -> boolean-testable;
        { u <  t } -> boolean-testable;
        { u >  t } -> boolean-testable;
        { u <= t } -> boolean-testable;
        { u >= t } -> boolean-testable;

    };
(3) (説明用*)
1) コンセプト std::totally_ordered は、ある型に対する比較演算子 ==,!=,<,>,<=,>= が、その型における厳密な全順序と整合する結果を返すことを指定する。
2) コンセプト std::totally_ordered_with は、(おそらく混在した) T および U オペランドに対する比較演算子 ==,!=,<,>,<=,>= が、厳密な全順序と整合する結果を返すことを指定する。混在したオペランドの比較は、オペランドをその共通型に変換して比較するのと等価な結果を返す。
3) 説明専用のコンセプト __PartiallyOrderedWith は、型 T の値と型 U の値が、<, >, <=, >= を使用して部分順序で互いに比較でき (どちらの順序でも)、比較の結果が整合することを指定する。

目次

[編集] 意味論的要件

これらのコンセプトは、それらが満たされ、かつそれらが含むすべてのコンセプトがモデル化されている場合にのみモデル化される。

1) std::totally_ordered<T> は、型 const std::remove_reference_t<T> の左辺値 abc が与えられた場合にのみモデル化される。
  • bool(a < b), bool(a > b), bool(a == b) のいずれか一つだけが true であること。
  • bool(a < b)bool(b < c) の両方が true である場合、bool(a < c)true であること。
  • bool(a > b) == bool(b < a)
  • bool(a >= b) == !bool(a < b)
  • bool(a <= b) == !bool(b < a)
2) std::totally_ordered_with<T, U> は、以下が与えられた場合にのみモデル化される。

Cstd::common_reference_t<const std::remove_reference_t<T>&, const std::remove_reference_t<U>&> とし、式 E と型 C が与えられた場合、CONVERT_TO<C>(E) を以下とする。

(C++23まで)
  • それが有効な式である場合は static_cast<const C&>(std::as_const(E))
  • static_cast<const C&>(std::move(E)) (そうでない場合)
(C++23から)

以下の条件が真である。

  • bool(t < u) == bool(CONVERT_TO<C>(t2) < CONVERT_TO<C>(u2))
  • bool(t > u) == bool(CONVERT_TO<C>(t2) > CONVERT_TO<C>(u2))
  • bool(t <= u) == bool(CONVERT_TO<C>(t2) <= CONVERT_TO<C>(u2))
  • bool(t >= u) == bool(CONVERT_TO<C>(t2) >= CONVERT_TO<C>(u2))
  • bool(u < t) == bool(CONVERT_TO<C>(u2) < CONVERT_TO<C>(t2))
  • bool(u > t) == bool(CONVERT_TO<C>(u2) > CONVERT_TO<C>(t2))
  • bool(u <= t) == bool(CONVERT_TO<C>(u2) <= CONVERT_TO<C>(t2))
  • bool(u >= t) == bool(CONVERT_TO<C>(u2) >= CONVERT_TO<C>(t2))
3) __PartiallyOrderedWith<T, U> は、以下が与えられた場合にのみモデル化される。

以下の条件が真である。

  • t < u, t <= u, t > u, t >= u, u < t, u <= t, u > t, u >= t は同じドメインを持つこと。
  • bool(t < u) == bool(u > t);
  • bool(u < t) == bool(t > u);
  • bool(t <= u) == bool(u >= t); および
  • bool(u <= t) == bool(t >= u).

[編集] 等価性保持

標準ライブラリのコンセプトのrequiresで宣言された式は、(特に明記されていない限り)等価性保持である必要があります。

[編集] 暗黙の式バリエーション

一部の定数左辺値オペランドに対して非変更的である式を使用するrequiresは、暗黙の式バリエーションも必要とする。

[編集] 参照

  • C++23標準 (ISO/IEC 14882:2024)
  • 18.5.5 Concept totally_ordered [concept.totallyordered]
  • C++20 standard (ISO/IEC 14882:2020)
  • 18.5.4 Concept totally_ordered [concept.totallyordered]

[編集] 関連項目

演算子<=>が与えられた型に対して一貫した結果を生成することを規定する
(コンセプト) [編集]
English 日本語 中文(简体) 中文(繁體)