Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      std::compare_weak_order_fallback

      From cppreference.com
      <cpp‎ |utility
       
       
      Utilities library
       
      Defined in header<compare>
      inlinenamespace/* unspecified */{

         inlineconstexpr/* unspecified */
              compare_weak_order_fallback=/* unspecified */;

      }
      (since C++20)
      Call signature
      template<class T,class U>

          requires/* see below */
      constexprstd::weak_ordering

          compare_weak_order_fallback( T&& t, U&& u)noexcept(/* see below */);
      (since C++20)

      Performs three-way comparison onsubexpressionst andu and produces a result of typestd::weak_ordering, even if the operator<=> is unavailable.

      Ifstd::decay_t<T> andstd::decay_t<U> are the same type,std::compare_weak_order_fallback(t, u) isexpression-equivalent to:

      • std::weak_order(t, u), if it is a well-formed expression; otherwise,
      • t== u? std::weak_ordering::equivalent:
        t<  u? std::weak_ordering::less:
                 std::weak_ordering::greater
        , if the expressionst== u andt< u are both well-formed and each ofdecltype(t== u) anddecltype(t< u) modelsboolean-testable, except thatt andu are evaluated only once.

      In all other cases,std::compare_weak_order_fallback(t, u) is ill-formed, which can result insubstitution failure when it appears in the immediate context of a template instantiation.

      Contents

      Customization point objects

      The namestd::compare_weak_order_fallback denotes acustomization point object, which is a constfunction object of aliteralsemiregular class type. SeeCustomizationPointObject for details.

      [edit]Example

      Run this code
      #include <compare>#include <iostream> // does not support <=>struct Rational_1{int num;int den;// > 0}; inlineconstexprbool operator<(Rational_1 lhs, Rational_1 rhs){return lhs.num* rhs.den< rhs.num* lhs.den;} inlineconstexprbool operator==(Rational_1 lhs, Rational_1 rhs){return lhs.num* rhs.den== rhs.num* lhs.den;} // supports <=>struct Rational_2{int num;int den;// > 0}; inlineconstexprstd::weak_ordering operator<=>(Rational_2 lhs, Rational_2 rhs){return lhs.num* rhs.den<=> rhs.num* lhs.den;} inlineconstexprbool operator==(Rational_2 lhs, Rational_2 rhs){return lhs<=> rhs==0;} void print(int id,std::weak_ordering value){std::cout<< id<<") ";if(value==0)std::cout<<"equal\n";elseif(value<0)std::cout<<"less\n";elsestd::cout<<"greater\n";} int main(){    Rational_1 a{1,2}, b{3,4};//  print(0, a <=> b); // does not work    print(1, std::compare_weak_order_fallback(a, b));// works, defaults to < and ==     Rational_2 c{6,5}, d{8,7};    print(2, c<=> d);// works    print(3, std::compare_weak_order_fallback(c, d));// works     Rational_2 e{2,3}, f{4,6};    print(4, e<=> f);// works    print(5, std::compare_weak_order_fallback(e, f));// works}

      Output:

      1) less2) greater3) greater4) equal5) equal

      [edit]Defect reports

      The following behavior-changing defect reports were applied retroactively to previously published C++ standards.

      DRApplied toBehavior as publishedCorrect behavior
      LWG 2114
      (P2167R3)
      C++20the fallback mechanism only required
      return types to be convertible tobool
      constraints strengthened

      [edit]See also

      (C++20)
      performs 3-way comparison and produces a result of typestd::weak_ordering
      (customization point object)[edit]
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/utility/compare/compare_weak_order_fallback&oldid=168771"

      [8]ページ先頭

      ©2009-2025 Movatter.jp