ред рд╣рдорд╛рд░реЗ рдмрд╣реБрдд рд╣реА рд╕рд╛рдЗрдорди рдмреНрд░рд╛рдВрдб рджреНрд╡рд╛рд░рд╛ рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХ...">

рд░реЙрдХреЗрдЯ рд╕рд╛рдЗрдВрд╕ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдПрдВ: C ++ 20 рдХрд╛ рд╕реНрдкреЗрд╕рд╢рд┐рдк рдСрдкрд░реЗрдЯрд░

C ++ 20 рдПрдХ рдирдпрд╛ рдСрдкрд░реЗрдЯрд░ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдкреНрдпрд╛рд░ рд╕реЗ "рд╕реНрдкреЗрд╕рд╢рд┐рдк" рдСрдкрд░реЗрдЯрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ: <=> ред рд╣рдорд╛рд░реЗ рдмрд╣реБрдд рд╣реА рд╕рд╛рдЗрдорди рдмреНрд░рд╛рдВрдб рджреНрд╡рд╛рд░рд╛ рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдЗрд╕ рдирдП рдСрдкрд░реЗрдЯрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдпрд╣ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ, рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреЛрд╕реНрдЯ рдХрд╛ рд▓рдХреНрд╖реНрдп рдЗрд╕ рдЕрдЬреАрдм рдирдП рдСрдкрд░реЗрдЯрд░ рдФрд░ рдЗрд╕рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдордХрдХреНрд╖ рдХреЗ рдХреБрдЫ рдареЛрд╕ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реИ, operator== (рдмреЗрд╣рддрд░ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ!), рд╣рд░ рд░реЛрдЬрд╝ рдХреЛрдб рдореЗрдВ рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реБрдПред



рддреБрд▓рдирд╛


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рддрд░рд╣ рдХреЛрдб рджреЗрдЦрдирд╛ рдХреЛрдИ рдЕрд╕рд╛рдорд╛рдиреНрдп рдмрд╛рдд рдирд╣реАрдВ рд╣реИ:

 struct IntWrapper {  int value;  constexpr IntWrapper(int value): value{value} { }  bool operator==(const IntWrapper& rhs) const { return value == rhs.value; }  bool operator!=(const IntWrapper& rhs) const { return !(*this == rhs);    }  bool operator<(const IntWrapper& rhs)  const { return value < rhs.value;  }  bool operator<=(const IntWrapper& rhs) const { return !(rhs < *this);    }  bool operator>(const IntWrapper& rhs)  const { return rhs < *this;        }  bool operator>=(const IntWrapper& rhs) const { return !(*this < rhs);    } }; 

рдиреЛрдЯ: рдИрдЧрд▓-рдЖрдИрдбреЗрдб рд░реАрдбрд░реНрд╕ рдпрд╣ рдиреЛрдЯрд┐рд╕ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрдо рдХреНрд░рд┐рдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреНрд░реА-рд╕реА ++ 20 рдХреЛрдб рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдпреЗ рдлрд╝рдВрдХреНрд╢рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рднреА рдХреЛ рдЧреИрд░-рдорд┐рддреНрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдмрд╛рдж рдореЗрдВред

рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдореЗрд░рд╛ рдкреНрд░рдХрд╛рд░ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреБрдЫ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛрдб рд╣реИред рдареАрдХ рд╣реИ, рдареАрдХ рд╣реИ, рд╣рдо рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП рдЗрд╕рд╕реЗ рдирд┐рдкрдЯрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдмрд╛рдж рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдЬреЛ рдЗрд╕реЗ рд▓рд┐рдЦрддрд╛ рд╣реИ:

 constexpr bool is_lt(const IntWrapper& a, const IntWrapper& b) {  return a < b; } int main() {  static_assert(is_lt(0, 1)); } 

рдкрд╣рд▓реА рдмрд╛рдд рдЬреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

error C3615: constexpr function 'is_lt' cannot result in a constant expression

рдЖрд╣! рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЕрдкрдиреЗ рддреБрд▓рдирд╛рддреНрдордХ рдлрд╝рдВрдХреНрд╢рди, рдбреНрд░реИрдЯ рдкрд░ constexpr рднреВрд▓ рдЧрдП рд╣реИрдВ! рддреЛ рдПрдХ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕рднреА рддреБрд▓рдирд╛рддреНрдордХ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдореЗрдВ constexpr рдХрд░рддрд╛ рд╣реИред рдХреБрдЫ рджрд┐рдиреЛрдВ рдмрд╛рдж рдХреЛрдИ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ is_gt рд╣реЗрд▓реНрдкрд░ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рднреА рдиреЛрдЯрд┐рд╕ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХреЗ рдкрд╛рд╕ рдЕрдкрд╡рд╛рдж рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ 5 рдУрд╡рд░рд▓реЛрдб рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ noexcept рдЬреЛрдбрд╝рдиреЗ рдХреА рдПрдХ рд╣реА рдердХрд╛рдК рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ noexcept рд╣реИред

рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ C ++ 20 рдХрд╛ рдирдпрд╛ рд╕реНрдкреЗрд╕рд╢рд┐рдк рдСрдкрд░реЗрдЯрд░ рд╣рдорд╛рд░реА рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрджрдо рдЙрдард╛рддрд╛ рд╣реИред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдореВрд▓ IntWrapper рдХреЛ C ++ 20 рджреБрдирд┐рдпрд╛ рдореЗрдВ рдХреИрд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 #include <compare> struct IntWrapper {  int value;  constexpr IntWrapper(int value): value{value} { }  auto operator<=>(const IntWrapper&) const = default; }; 

рдкрд╣рд▓рд╛ рдЕрдВрддрд░ рдЬреЛ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд╣ рд╣реИ <compare> рдХрд╛ рдирдпрд╛ рд╕рдорд╛рд╡реЗрд╢ред рд╣рдорд╛рд░реЗ рддреБрд▓рдирд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдкреНрд░рдХрд╛рд░ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдкреЗрд╕рд╢рд┐рдк рдСрдкрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рддреБрд▓рдирд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП <compare> рд╣реЗрдбрд░ рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдКрдкрд░ рджрд┐рдП рдЧрдП рд╕реНрдирд┐рдкреЗрдЯ рдореЗрдВ, рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ auto рдХреЛ std::strong_ordering ред

рди рдХреЗрд╡рд▓ рд╣рдордиреЗ 5 рдЕрдзрдХрдЪрд░реА рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛, рдмрд▓реНрдХрд┐ рд╣рдореЗрдВ рдХреБрдЫ рднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХрдВрдкрд╛рдЗрд▓рд░ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реИ! рд╣рдорд╛рд░рд╛ is_lt рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рдмрдирд╛ рд╣реБрдЖ рд╣реИ рдФрд░ рдЕрднреА рднреА рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬрдмрдХрд┐ рд╣рдо рдЕрднреА рднреА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реБрдП рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ operator<=> рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдФрд░ рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рд▓реЛрдЧ рдЕрдкрдиреЗ рд╕рд┐рд░ рдХреЛ рдЦрд░реЛрдВрдЪ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВ is_lt рдХреЛ рдЕрднреА рднреА рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ, рднрд▓реЗ рд╣реА рдпрд╣ рдЕрдВрддрд░рд┐рдХреНрд╖ рдпрд╛рди рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЖрдЗрдП рдЗрд╕ рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рддрд▓рд╛рд╢рддреЗ рд╣реИрдВред

рдЕрднрд┐рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рднрд╛рд╡


C ++ 20 рдореЗрдВ, рд╕рдВрдХрд▓рдХ рдХреЛ рдПрдХ рдирдИ рдЕрд╡рдзрд╛рд░рдгрд╛ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдХрд░рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ "рдкреБрди: рд▓рд┐рдЦрд┐рдд" рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрднрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕реНрдкреЗрд╕рд╢рд┐рдк рдСрдкрд░реЗрдЯрд░, operator== рдХреЗ рд╕рд╛рде, рдкрд╣рд▓реЗ рджреЛ рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдЕрдзреАрди рд╣реИрдВред рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреБрдирд░реНрд▓реЗрдЦрди рдХреЗ рдЕрдзрд┐рдХ рдареЛрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП is_lt рдореЗрдВ is_lt рдЧрдП рдЙрджрд╛рд╣рд░рдг рдХреЛ is_lt ред

рдУрд╡рд░рд▓реЛрдб рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдХреЗ рджреМрд░рд╛рди рдХрдВрдкрд╛рдЗрд▓рд░ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рд╕реЗ рдЪрдпрди рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдЬреЛ рд╕рднреА рдЙрд╕ рдСрдкрд░реЗрдЯрд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреА рд╣рдо рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд░рд┐рд▓реЗрд╢рдирд▓ рдФрд░ рд╕рдорддреБрд▓реНрдпрддрд╛ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЙрдореНрдореАрджрд╡рд╛рд░ рдХреА рдПрдХрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрд╣реБрдд рдХрдо рдмрджрд▓реА рдЬрд╛рддреА рд╣реИ, рдЬрд╣рд╛рдВ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рднреА рд╡рд┐рд╢реЗрд╖ рд▓рд┐рдЦрд┐рдд рдФрд░ рд╕рдВрд╢реНрд▓реЗрд╖рд┐рдд рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ ( [over.match.oper] /3.4 ) рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рд╣рдорд╛рд░реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ a < b рдорд╛рдирдХ рдорд╛рдирдХ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдо operator<=> рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ operator<=> рдпрд╛ рдПрдХ рдирд╛рдо рд╕реНрдерд╛рди рдЧреБрдВрдЬрд╛рдЗрд╢ рдлрд╝рдВрдХреНрд╢рди operator<=> рдЬреЛ рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рддреЛ рд╕рдВрдХрд▓рдХ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдкрд╛рддрд╛ рд╣реИ рдХрд┐, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, a рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрддрд╛ рд╣реИ IntWrapper::operator<=> ред рд╕рдВрдХрд▓рдХ рдХреЛ рддрдм рдЙрд╕ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ a < b (a <=> b) < 0 рд░реВрдк рдореЗрдВ рдлрд┐рд░ рд╕реЗ (a <=> b) < 0 ред рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд╛рдорд╛рдиреНрдп рдЕрдзрд┐рднрд╛рд░ рд╕рдВрдХрд▓реНрдк рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдореНрдореАрджрд╡рд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЖрдк рдЦреБрдж рд╕реЗ рдкреВрдЫ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдкреБрдирд░реНрд▓реЗрдЦрди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╡реИрдз рдФрд░ рд╕рд╣реА рдХреНрдпреЛрдВ рд╣реИред рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рд╢реБрджреНрдзрддрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╢рдмреНрджрд╛рд░реНрде рд╕реЗ рдЙрдкрдЬреА рд╣реИ рдЬрд┐рд╕реЗ рд╕реНрдкреЗрд╕рд╢рд┐рдк рдСрдкрд░реЗрдЯрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред <=> рдПрдХ рддреАрди-рддрд░рдлрд╛ рддреБрд▓рдирд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рди рдХреЗрд╡рд▓ рдПрдХ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рдЖрджреЗрд╢ (рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ) рдФрд░ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдИ рдЖрджреЗрд╢ рд╣реИ рддреЛ рдЖрдк рдХрд┐рд╕реА рднреА рд╕рдВрдмрдВрдзрдкрд░рдХ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЙрд╕ рдЖрджреЗрд╢ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рддреНрд╡рд░рд┐рдд рдЙрджрд╛рд╣рд░рдг, C ++ 20 рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ 4 <=> 5 рдЖрдкрдХреЛ рдкрд░рд┐рдгрд╛рдо std::strong_ordering::less ред std::strong_ordering::less рдкрд░рд┐рдгрд╛рдо рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рд╣реИ рдХрд┐ 4 рди рдХреЗрд╡рд▓ 5 рд╕реЗ рдЕрд▓рдЧ рд╣реИ, рдмрд▓реНрдХрд┐ рдпрд╣ рдЙрд╕ рдореВрд▓реНрдп рд╕реЗ рдХрдбрд╝рд╛рдИ рд╕реЗ рдХрдо рд╣реИ, рдЗрд╕рд╕реЗ рдСрдкрд░реЗрд╢рди рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ (4 <=> 5) < 0 рд╣рдорд╛рд░реЗ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдФрд░ рд╕рдЯреАрдХ рд╣реИред

рд╕рдВрдХрд▓рдХ рдХреЗ рдКрдкрд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрдИ рднреА рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╕рдВрдмрдВрдз рдСрдкрд░реЗрдЯрд░ (рдпрд╛рдиреА < , > , рдЖрджрд┐) рд▓реЗ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕реНрдкреЗрд╕рд╢рд┐рдк рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИред рдорд╛рдирдХ рдореЗрдВ рдкреБрди: рд▓рд┐рдЦрд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдЕрдХреНрд╕рд░ (a <=> b) @ 0 рд░реВрдк рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ @ рдХрд┐рд╕реА рднреА рд╕рдВрдмрдВрдзрдкрд░рдХ рдСрдкрд░реЗрд╢рди рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред

рд╕рд┐рдВрдереЗрд╕рд╛рдЗрдЬрд╝рд┐рдВрдЧ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди


рдкрд╛рдардХреЛрдВ рдиреЗ рдКрдкрд░ "рд╕рдВрд╢реНрд▓реЗрд╖рд┐рдд" рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕реВрдХреНрд╖реНрдо рдЙрд▓реНрд▓реЗрдЦ рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╡реЗ рдЗрд╕ рдСрдкрд░реЗрдЯрд░ рдкреБрдирд░реНрд▓реЗрдЦрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рднреА рдПрдХ рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддреЗ рд╣реИрдВред рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдзреЗрдп рд╕рдорд╛рд░реЛрд╣ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

 constexpr bool is_gt_42(const IntWrapper& a) {  return 42 < a; } 

рдпрджрд┐ рд╣рдо IntWrapper рд▓рд┐рдП рдЕрдкрдиреА рдореВрд▓ рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ IntWrapper рдпрд╣ рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

error C2677: binary '<': no global operator found which takes type 'const IntWrapper' (or there is no acceptable conversion)

рдпрд╣ рдкреВрд░реНрд╡-рд╕реА ++ 20 рднреВрдорд┐ рдореЗрдВ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ IntWrapper рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд friend рдХрд╛рд░реНрдпреЛрдВ рдХреЛ IntWrapper рдЬреЛ IntWrapper рдмрд╛рдПрдВ рд╣рд╛рде рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдЙрд╕ рдирдореВрдиреЗ рдХреЛ C ++ 20 рд╕рдВрдХрд▓рдХ рдФрд░ рд╣рдорд╛рд░реЗ C ++ 20 рдкрд░рд┐рднрд╛рд╖рд╛ рд╡рд╛рд▓реЗ IntWrapper рд╕рд╛рде рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣, рдлрд┐рд░ рд╕реЗ, "рдмрд╕ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ" - рдкреНрд░рдореБрдЦ рд╕рд┐рд░ рдЦрд░реЛрдВрдЪред рдЖрдЗрдП рдЬрд╛рдВрдЪ рдХрд░реЗрдВ рдХрд┐ рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдХреЛ рдЕрднреА рднреА C ++ 20 рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдХреНрдпреЛрдВ рд╣реИред

рдЕрдзрд┐рднрд╛рд░ рд╕рдВрдХрд▓реНрдк рдХреЗ рджреМрд░рд╛рди рд╕рдВрдХрд▓рдХ рднреА рдЗрдХрдЯреНрдард╛ рдХрд░реЗрдЧрд╛ рдХрд┐ рдорд╛рдирдХ "рд╕рдВрд╢реНрд▓реЗрд╖рд┐рдд" рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдпрд╛ рдлрд┐рд░ рд╕реЗ рдмрджрд▓реЗ рдЧрдП рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдХреНрд░рдо рдХреЗ рд╕рд╛рде рдПрдХ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗ рдЧрдП рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ред рд╕рдВрдХрд▓рдХ рдХреЗ рдКрдкрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдкреБрди: рд▓рд┐рдЦрд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ (42 <=> a) < 0 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдпрд╣ рдкрд╛рдПрдВрдЧреЗ рдХрд┐ рдмрд╛рдПрдВ рд╣рд╛рде рдХреА рдУрд░ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП IntWrapper рд╕реЗ рдХреЛрдИ рд░реВрдкрд╛рдВрддрд░рдг рдирд╣реАрдВ рд╣реИ рддрд╛рдХрд┐ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдЧрд┐рд░рд╛ рджрд┐рдпрд╛ рдЬрд╛рдПред рдХрдВрдкрд╛рдЗрд▓рд░ "рд╕рдВрд╢реНрд▓реЗрд╖рд┐рдд" рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ 0 < (a <=> 42) рдХреЛ рднреА IntWrapper рд╣реИ рдФрд░ рдкрд╛рддрд╛ рд╣реИ рдХрд┐ int рдореЗрдВ IntWrapper рд╕реЗ рдЗрд╕рдХреЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░реВрдкрд╛рдВрддрд░рдг рд╣реЛрддрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдЙрдореНрдореАрджрд╡рд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╕рдВрд╢реНрд▓реЗрд╖рд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рд▓рдХреНрд╖реНрдп рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреА рдЧрдбрд╝рдмрдбрд╝реА рд╕реЗ рдмрдЪрдирд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдЖрдкрдХреА рд╡рд╕реНрддреБ рдХреЛ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рдВрд╢реНрд▓реЗрд╖рд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ 0 @ (b <=> a) рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкреНрд░рдХрд╛рд░


рдХрдВрдкрд╛рдЗрд▓рд░-рдЬрдирд░реЗрдЯреЗрдб рд╕реНрдкреЗрд╕рд╢рд┐рдк рдСрдкрд░реЗрдЯрд░ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдПрдХрд▓ рд╕рджрд╕реНрдпреЛрдВ рдкрд░ рдирд╣реАрдВ рд░реБрдХрддрд╛ рд╣реИ, рдпрд╣ рдЖрдкрдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рднреАрддрд░ рд╕рднреА рдЙрдк-рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рддреБрд▓рдирд╛ рдХрд╛ рдПрдХ рд╕рд╣реА рд╕реЗрдЯ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛:

 struct Basics {  int i;  char c;  float f;  double d;  auto operator<=>(const Basics&) const = default; }; struct Arrays {  int ai[1];  char ac[2];  float af[3];  double ad[2][2];  auto operator<=>(const Arrays&) const = default; }; struct Bases : Basics, Arrays {  auto operator<=>(const Bases&) const = default; }; int main() {  constexpr Bases a = { { 0, 'c', 1.f, 1. },                        { { 1 }, { 'a', 'b' }, { 1.f, 2.f, 3.f }, { { 1., 2. }, { 3., 4. } } } };  constexpr Bases b = { { 0, 'c', 1.f, 1. },                        { { 1 }, { 'a', 'b' }, { 1.f, 2.f, 3.f }, { { 1., 2. }, { 3., 4. } } } };  static_assert(a == b);  static_assert(!(a != b));  static_assert(!(a < b));  static_assert(a <= b);  static_assert(!(a > b));  static_assert(a >= b); } 

рдХрдВрдкрд╛рдЗрд▓рд░ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЙрди рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдП рдЬреЛ рдЙрдк-рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреА рдЙрдирдХреА рд╕реВрдЪреА рдореЗрдВ рд╕рд░рдгрд┐рдпрд╛рдБ рд╣реИрдВ рдФрд░ рдЙрдирдХреА рдкреБрдирд░рд╛рд╡рд░реНрддреА рддреБрд▓рдирд╛ рдХрд░реЗрдВред рдмреЗрд╢рдХ, рдпрджрд┐ рдЖрдк рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдирд┐рдХрд╛рдпреЛрдВ рдХреЛ рд╕реНрд╡рдпрдВ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ, рддреЛ рдЖрдкрдХреЛ рдЕрднреА рднреА рдЖрдкрдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рдХ рдкреБрдирд░реНрд▓реЗрдЦрди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рд▓рд╛рдн рдорд┐рд▓реЗрдЧрд╛ред

рдПрдХ рдмрддрдЦ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, рдПрдХ рдмрддрдЦ рдХреА рддрд░рд╣ рддреИрд░рддрд╛ рд╣реИ, рдФрд░ operator== рддрд░рд╣ рдХреНрд╡реИрдХреНрд╕ operator==


рдорд╛рдирдХреАрдХрд░рдг рд╕рдорд┐рддрд┐ рдХреЗ рдХреБрдЫ рдмрд╣реБрдд рд╣реА рдЪрддреБрд░ рд▓реЛрдЧреЛрдВ рдиреЗ рджреЗрдЦрд╛ рдХрд┐ рд╕реНрдкреЗрд╕рд╢рд┐рдк рдСрдкрд░реЗрдЯрд░ рд╣рдореЗрд╢рд╛ рддрддреНрд╡реЛрдВ рдХреА рдХреЛрдИ рддреБрд▓рдирд╛рддреНрдордХ рддреБрд▓рдирд╛ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рд▓реЗрдХреНрд╕рд┐рдХреЛрдЧреНрд░рд╛рдлрд┐рдХ рддреБрд▓рдирд╛рдУрдВ рдХреЗ рдмрд┐рдирд╛ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдорд╛рдирддрд╛ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдЕрдХреНрд╖рдо рдЙрддреНрдкрдиреНрди рдХреЛрдб рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рд╡рд┐рд╣рд┐рдд рдЙрджрд╛рд╣рд░рдг рджреЛ рддрд╛рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕реНрдЯреНрд░рд┐рдВрдЧ "foobar" рдФрд░ рдЖрдк рдЗрд╕реЗ == рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд╕реНрдЯреНрд░рд┐рдВрдЧ "foo" рд╕реЗ рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡рд╣ рдЙрдореНрдореАрдж рдХрд░реЗрдЧрд╛ рдХрд┐ рдСрдкрд░реЗрд╢рди рд▓рдЧрднрдЧ рд╕реНрдерд┐рд░ рд╣реЛред рдХреБрд╢рд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧ рддреБрд▓рдирд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

  • рдкрд╣рд▓реЗ рджреЛ рддрд╛рд░реЛрдВ рдХреЗ рдЖрдХрд╛рд░ рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ, рдпрджрд┐ рдЖрдХрд╛рд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ false , рдЕрдиреНрдпрдерд╛
  • рджреЛ рддрд╛рд░реЛрдВ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХрд╕рдорд╛рди рдореЗрдВ рдХрджрдо рд░рдЦреЗрдВ рдФрд░ рддрдм рддрдХ рддреБрд▓рдирд╛ рдХрд░реЗрдВ рдЬрдм рддрдХ рдХрд┐ рдПрдХ рдЕрд▓рдЧ рдпрд╛ рдЕрдВрдд рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рдПрдВред

рд╕реНрдкреЗрд╕рд╢рд┐рдк рдСрдкрд░реЗрдЯрд░ рдирд┐рдпрдореЛрдВ рдХреЗ рддрд╣рдд рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдкрд░ рдЧрд╣рд░реА рддреБрд▓рдирд╛ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рд╣рдо рдПрдХ рдЕрд▓рдЧ рдирд╣реАрдВ рдкрд╛рддреЗ рд╣реИрдВред "foobar" рдФрд░ "foo" рдХреЗ рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ 'b' рддреБрд▓рдирд╛ '\0' рдХрд░рдиреЗ рдкрд░ рд╣реА рдЖрдк рдЕрдВрдд рдореЗрдВ false ред

рдЗрд╕рдХрд╛ рдореБрдХрд╛рдмрд▓рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЗрдкрд░ рдерд╛, P1185R2 рдЬреЛ рд╕рдВрдХрд▓рдХ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд░рд╣ рд╕реЗ рд╡рд┐рд╡рд░рдг рджреЗрддрд╛ рд╣реИ рдФрд░ operator== рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рд╕реНрдкреЗрд╕рд╢рд┐рдк рдСрдкрд░реЗрдЯрд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдФрд░ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рд╣рдорд╛рд░реЗ IntWrapper рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 #include <compare> struct IntWrapper {  int value;  constexpr IntWrapper(int value): value{value} { }  auto operator<=>(const IntWrapper&) const = default;  bool operator==(const IntWrapper&) const = default; }; 

рдмрд╕ рдПрдХ рдФрд░ рдХрджрдо ... рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЪреНрдЫреА рдЦрдмрд░ рд╣реИ; рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдмрд╕ auto operator<=>(const IntWrapper&) const = default рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдФрд░ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ - operator== рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ!

рдХрдВрдкрд╛рдЗрд▓рд░ == рдФрд░ != рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░реВрдк рд╕реЗ рдереЛрдбрд╝реЗ рдмрджрд▓реЗ рд╣реБрдП "рд░реАрд░рд╛рдЗрдЯ" рдирд┐рдпрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдЗрди рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ operator== рд╕рдВрджрд░реНрдн рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ operator<=> рдирд╣реАрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ != рдЕрдиреБрдХреВрд▓рди рд╕реЗ рднреА рдмрд╣реБрдд рд▓рд╛рдн рдорд┐рд▓рддрд╛ рд╣реИред

рдкреБрд░рд╛рдирд╛ рдХреЛрдб рдирд╣реАрдВ рдЯреВрдЯреЗрдЧрд╛


рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдЖрдк рд╕реЛрдЪ рд░рд╣реЗ рд╣реЛрдВрдЧреЗ, рдареАрдХ рд╣реИ рдЕрдЧрд░ рд╕рдВрдХрд▓рдХ рдХреЛ рдЗрд╕ рдСрдкрд░реЗрдЯрд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╡реНрдпрд╡рд╕рд╛рдп рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ рддреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдореИрдВ рд╕рдВрдХрд▓рдХ рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ:

 struct IntWrapper {  int value;  constexpr IntWrapper(int value): value{value} { }  auto operator<=>(const IntWrapper&) const = default;  bool operator<(const IntWrapper& rhs) const { return value < rhs.value; } }; constexpr bool is_lt(const IntWrapper& a, const IntWrapper& b) {  return a < b; } 

рдпрд╣рд╛рдБ рдЙрддреНрддрд░ рд╣реИ, рдЖрдкрдиреЗ рдирд╣реАрдВ рдХрд┐рдпрд╛ред C ++ рдореЗрдВ рдУрд╡рд░рд▓реЛрдб рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдореЙрдбрд▓ рдореЗрдВ рдпрд╣ рдХреНрд╖реЗрддреНрд░ рд╣реИ рдЬрд╣рд╛рдВ рд╕рднреА рдЙрдореНрдореАрджрд╡рд╛рд░ рд▓рдбрд╝рд╛рдИ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд▓рдбрд╝рд╛рдИ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 3 рдЙрдореНрдореАрджрд╡рд╛рд░ рд╣реИрдВ:

  • IntWrapper::operator<(const IntWrapper& a, const IntWrapper& b)
  • IntWrapper::operator<=>(const IntWrapper& a, const IntWrapper& b)

(рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛)

  • IntWrapper::operator<=>(const IntWrapper& b, const IntWrapper& a)

(рд╕рдордиреНрд╡рд┐рдд)

рдпрджрд┐ рд╣рдо C ++ 17 рдореЗрдВ рдЕрдзрд┐рднрд╛рд░ рд╕рдВрдХрд▓реНрдк рдирд┐рдпрдореЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЙрд╕ рдХреЙрд▓ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЕрд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рд╕рдВрдХрд▓рдХ рдХреЛ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдмрд╕реЗ рддрд╛рд░реНрдХрд┐рдХ рдЕрдзрд┐рднрд╛рд░ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП C ++ 20 рдЕрдзрд┐рднрд╛рд░ рд╕рдВрдХрд▓реНрдк рдирд┐рдпрдореЛрдВ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдЕрдзрд┐рднрд╛рд░ рд╕рдВрдХрд▓реНрдк рдХрд╛ рдПрдХ рдЪрд░рдг рд╣реИ рдЬрд╣рд╛рдВ рд╕рдВрдХрд▓рдХ рдХреЛ рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдЯрд╛рдИрдмреНрд░реЗрдХрд░ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред C ++ 20 рдореЗрдВ, рдПрдХ рдирдпрд╛ рдЯрд╛рдИрдмреНрд░реЗрдХрд░ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЙрди IntWrapper::operator< рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдиреА рдЪрд╛рд╣рд┐рдП рдЬреЛ рдкреБрди: рд▓рд┐рдЦрд┐рдд рдпрд╛ рд╕рдВрд╢реНрд▓реЗрд╖рд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕рд╕реЗ рд╣рдорд╛рд░рд╛ рдЕрдзрд┐рднрд╛рд░ IntWrapper::operator< рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЙрдореНрдореАрджрд╡рд╛рд░ IntWrapper::operator< рдФрд░ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╡рд╣реА рдорд╢реАрдирд░реА рд╕рдВрд╢реНрд▓реЗрд╖рд┐рдд рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ рдХреЛ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рд▓рд┐рдЦрд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдкрд░ рд╕реНрдЯрдВрдкрд┐рдВрдЧ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддреА рд╣реИред

рд╡рд┐рдЪрд╛рд░ рдмрдВрдж рдХрд░рдирд╛


рд╕реНрдкреЗрд╕рд╢рд┐рдк рдСрдкрд░реЗрдЯрд░ рд╕реА ++ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрд╡рд╛рдЧрдд рдпреЛрдЧреНрдп рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реИ рдФрд░ рдпрд╣ рдЙрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдФрд░ рдХрдо рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛, рдФрд░ рдХрднреА-рдХрднреА, рдХрдо рдЕрдзрд┐рдХ рд╣реЛрддрд╛ рд╣реИред рддреЛ C ++ 20 рдХреЗ рд╕реНрдкреЗрд╕рд╢рд┐рдк рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдмрдХрд╕реБрдЖ рдХрд░реЗрдВ!

рд╣рдо рдЖрдкрд╕реЗ рдмрд╛рд╣рд░ рдЬрд╛рдиреЗ рдФрд░ рд╕реНрдкреЗрд╕рд╢рд┐рдк рдСрдкрд░реЗрдЯрд░ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХрд╛ рдЖрдЧреНрд░рд╣ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдЕрднреА рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ 2019 рдореЗрдВ /std:c++latest рддрд╣рдд рдЙрдкрд▓рдмреНрдз рд╣реИ! рдПрдХ рдиреЛрдЯ рдХреЗ рд░реВрдк рдореЗрдВ, P1185R2 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреЗрд╢ рдХрд┐рдП рдЧрдП рдкрд░рд┐рд╡рд░реНрддрди рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ 2019 рд╕рдВрд╕реНрдХрд░рдг 16.2 рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛрдВрдЧреЗред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рд╕реНрдкреЗрд╕рд╢рд┐рдк рдСрдкрд░реЗрдЯрд░ C ++ 20 рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдФрд░ рдХреБрдЫ рдмрджрд▓рд╛рд╡реЛрдВ рдХреЗ рдЕрдзреАрди рд╣реИ рдЬрдм рддрдХ рдХрд┐ C ++ 20 рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рдирд╣реАрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рд╣рдо рдЖрдкрдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рдХрд░рддреЗ рд╣реИрдВред Visualcpp@microsoft.com рдкрд░ рдИ-рдореЗрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, Twitter @visualc , рдпрд╛ Facebook рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ Microsoft Visual Cpp рдкрд░ рдХреЛрдИ рднреА рдЯрд┐рдкреНрдкрдгреА рднреЗрдЬрдиреЗ рдореЗрдВ рд╕рдВрдХреЛрдЪ рди рдХрд░реЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЯреНрд╡рд┐рдЯрд░ @starfreakclone рдкрд░ рдореЗрд░рд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред

рдпрджрд┐ рдЖрдк рд╡реАрдПрд╕ 2019 рдореЗрдВ рдПрдордПрд╕рд╡реАрд╕реА рдХреЗ рд╕рд╛рде рдЕрдиреНрдп рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рд╣рдореЗрдВ рдЗрдВрд╕реНрдЯреЙрд▓рд░ рдпрд╛ рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдЖрдИрдбреАрдИ рд╕реЗ рд░рд┐рдкреЛрд░реНрдЯ рд╕рдорд╕реНрдпрд╛ рд╡рд┐рдХрд▓реНрдк рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрддрд╛рдПрдВред рд╕реБрдЭрд╛рд╡ рдпрд╛ рдмрдЧ рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП, рджреЗрд╡рдХреЙрдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рдореЗрдВ рдмрддрд╛рдПрдВ ред

Source: https://habr.com/ru/post/hi458248/


All Articles