C ++ 20 рдореЗрдВ рддреБрд▓рдирд╛ рд╕рдВрдЪрд╛рд▓рди

рдХреЛрд▓реЛрди рдореЗрдВ рдмреИрдардХ рдкрд╛рд░рд┐рдд рд╣реЛ рдЧрдИ рд╣реИ, C ++ 20 рдорд╛рдирдХ рдХреЛ рдХрдо рдпрд╛ рдЬреНрдпрд╛рджрд╛ рд╕рдорд╛рдкреНрдд рд░реВрдк рдореЗрдВ (рд╡рд┐рд╢реЗрд╖ рдиреЛрдЯреЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рддрдХ) рдХрдо рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдореИрдВ рдЖрдЧрд╛рдореА рдирд╡рд╛рдЪрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдпрд╣ рдПрдХ рддрдВрддреНрд░ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдорддреМрд░ рдкрд░ рдСрдкрд░реЗрдЯрд░ <=> рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдорд╛рдирдХ рдЗрд╕реЗ "рддреАрди-рддрд░рдлрд╛ рддреБрд▓рдирд╛ рдСрдкрд░реЗрдЯрд░" рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдЕрдиреМрдкрдЪрд╛рд░рд┐рдХ рдЙрдкрдирд╛рдо "рд╕реНрдкреЗрд╕рд╢рд┐рдк" рд╣реИ), рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рджрд╛рдпрд░рд╛ рдмрд╣реБрдд рд╡реНрдпрд╛рдкрдХ рд╣реИред

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рд┐рд░реНрдл рдПрдХ рдирдпрд╛ рдСрдкрд░реЗрдЯрд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛ - рддреБрд▓рдирд╛рдУрдВ рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рднрд╛рд╖рд╛ рдХреЗ рд╕реНрддрд░ рдкрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрджрд▓рд╛рд╡реЛрдВ рд╕реЗ рдЧреБрдЬрд░реЗрдВрдЧреЗред

рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдЖрдк рдЗрд╕ рд▓реЗрдЦ рд╕реЗ рдмрд╛рд╣рд░ рдХреБрдЫ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдпрд╛рдж рд░рдЦреЗрдВ:
рд╕рдорд╛рдирддрд╛
рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдмрдирд╛рдиреЗ
рдмреБрдирд┐рдпрд╛рджреА
==
<=>
рдбреЗрд░рд┐рд╡реЗрдЯрд┐рд╡
! =
< , > , <= >> =

рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдирдпрд╛ рдСрдкрд░реЗрдЯрд░ рд╣реЛрдЧрд╛, <=> , рд▓реЗрдХрд┐рди, рдЗрд╕рд╕реЗ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдЕрдм рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореВрд▓ рдСрдкрд░реЗрдЯрд░ рд╣реИрдВ рдФрд░ рд╡реНрдпреБрддреНрдкрдиреНрди рдСрдкрд░реЗрдЯрд░ рд╣реИрдВ - рдкреНрд░рддреНрдпреЗрдХ рд╕рдореВрд╣ рдХреА рдЕрдкрдиреА рдХреНрд╖рдорддрд╛рдПрдВ рд╣реИрдВред

рд╣рдо рдЗрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдиреБрднрд╛рдЧреЛрдВ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред

рдмреБрдирд┐рдпрд╛рджреА рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдЙрд▓рдЯрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдпрд╛рдиреА рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ рдХреЗ рд╕рд╛рде рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ)ред рд╡реНрдпреБрддреНрдкрдиреНрди рдмрдпрд╛рдиреЛрдВ рдХреЛ рдЗрд╕реА рдЖрдзрд╛рд░ рд╡рд┐рд╡рд░рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рди рддреЛ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдФрд░ рди рд╣реА рд▓рд┐рдЦрд┐рдд рдЙрдореНрдореАрджрд╡рд╛рд░ рдирдП рдХрд╛рд░реНрдп рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ, рд╡реЗ рдХреЗрд╡рд▓ рд╕реНрд░реЛрдд рдХреЛрдб рд╕реНрддрд░ рдкрд░ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╕реЗрдЯ рд╕реЗ рдЪреБрдиреЗ рдЬрд╛рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ <a 9 рдХреЛ рдЕрдм a.operator <=> (9) <0 , рдФрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ 10! = B as рдХреЗ рд░реВрдк рдореЗрдВ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ! рдСрдкрд░реЗрдЯрд░ == (b, 10) ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдпрд╛ рджреЛ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд╕рд╛рде рдлреИрд▓рд╛рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рдЬрд╣рд╛рдВ рд╕рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдм рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ 2, 4, 6, рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ 12 рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рд▓рд┐рдЦрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╕рд╛рде рдирд┐рдпрдореЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЕрд╡рд▓реЛрдХрди рдиреАрдЪреЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рджреЛрдиреЛрдВ рдореВрд▓ рдФрд░ рд╡реНрдпреБрддреНрдкрдиреНрди рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдмреБрдирд┐рдпрд╛рджреА рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдСрдкрд░реЗрдЯрд░ рдХреЛ рдШреЛрд╖рдгрд╛ рдХреЗ рдХреНрд░рдо рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╕рджрд╕реНрдп рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛; рд╡реНрдпреБрддреНрдкрдиреНрди рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреБрдирд░реНрд▓реЗрдЦрди рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдРрд╕рд╛ рдХреЛрдИ рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдСрдкрд░реЗрдЯрд░ (рдпрд╛рдиреА, рд╕рдорд╛рдирддрд╛ рдпрд╛ рдЖрджреЗрд╢) рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╣рдорд╛рд░реА рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдХреЙрд▓рдо рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдПрдХ-рджреВрд╕рд░реЗ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд╣реИрдВред рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ == рдмреА рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрднреА рднреА рдСрдкрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ <=> (рдП, рдмреА) == 0 рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ (рд▓реЗрдХрд┐рди, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдХреБрдЫ рднреА рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдСрдкрд░реЗрдЯрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рдирд╣реАрдВ рд╣реИ == рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ <=> рдЕрдЧрд░ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ)ред

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

C ++ 17 рдореЗрдВ, рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ 18 рддреБрд▓рдирд╛рддреНрдордХ рдХрд╛рд░реНрдп рд▓рд┐рдЦрдиреЗ рд╣реЛрдВрдЧреЗ:

class CIString { string s; public: friend bool operator==(const CIString& a, const CIString& b) { return assize() == bssize() && ci_compare(asc_str(), bsc_str()) == 0; } friend bool operator< (const CIString& a, const CIString& b) { return ci_compare(asc_str(), bsc_str()) < 0; } friend bool operator!=(const CIString& a, const CIString& b) { return !(a == b); } friend bool operator> (const CIString& a, const CIString& b) { return b < a; } friend bool operator>=(const CIString& a, const CIString& b) { return !(a < b); } friend bool operator<=(const CIString& a, const CIString& b) { return !(b < a); } friend bool operator==(const CIString& a, const char* b) { return ci_compare(asc_str(), b) == 0; } friend bool operator< (const CIString& a, const char* b) { return ci_compare(asc_str(), b) < 0; } friend bool operator!=(const CIString& a, const char* b) { return !(a == b); } friend bool operator> (const CIString& a, const char* b) { return b < a; } friend bool operator>=(const CIString& a, const char* b) { return !(a < b); } friend bool operator<=(const CIString& a, const char* b) { return !(b < a); } friend bool operator==(const char* a, const CIString& b) { return ci_compare(a, bsc_str()) == 0; } friend bool operator< (const char* a, const CIString& b) { return ci_compare(a, bsc_str()) < 0; } friend bool operator!=(const char* a, const CIString& b) { return !(a == b); } friend bool operator> (const char* a, const CIString& b) { return b < a; } friend bool operator>=(const char* a, const CIString& b) { return !(a < b); } friend bool operator<=(const char* a, const CIString& b) { return !(b < a); } }; 

C ++ 20 рдореЗрдВ, рдЖрдк рдХреЗрд╡рд▓ 4 рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 class CIString { string s; public: bool operator==(const CIString& b) const { return s.size() == bssize() && ci_compare(s.c_str(), bsc_str()) == 0; } std::weak_ordering operator<=>(const CIString& b) const { return ci_compare(s.c_str(), bsc_str()) <=> 0; } bool operator==(char const* b) const { return ci_compare(s.c_str(), b) == 0; } std::weak_ordering operator<=>(const char* b) const { return ci_compare(s.c_str(), b) <=> 0; } }; 

рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рд╕рднреА рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ, рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ, рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рдереЛрдбрд╝рд╛ рдкреАрдЫреЗ рдЪрд▓рддреЗ рд╣реИрдВ рдФрд░ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рддреБрд▓рдирд╛рдУрдВ рдиреЗ C ++ 20 рдорд╛рдирдХ рддрдХ рдХреИрд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ред

C ++ 98 рд╕реЗ C ++ 17 рддрдХ рдХреЗ рдорд╛рдирдХреЛрдВ рдореЗрдВ рддреБрд▓рдирд╛


рднрд╛рд╖рд╛ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрд╛рдж рд╕реЗ рддреБрд▓рдирд╛рддреНрдордХ рд╕рдВрдЪрд╛рд▓рди рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдЫрд╣ рд╕рдВрдЪрд╛рд▓рдХ рдереЗ: == ; =!, < , > , <= рдФрд░ > = ред рдорд╛рдирдХ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рд╡реЗ рд╕рдорд╛рди рдирд┐рдпрдореЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВред рдХрд┐рд╕реА рднреА @ b рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ (рдЬрд╣рд╛рдВ @ рдЫрд╣ рддреБрд▓рдирд╛рддреНрдордХ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ) рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддреЗ рд╕рдордп, рд╕рдВрдХрд▓рдХ рд╕рджрд╕реНрдп рдХрд╛рд░реНрдпреЛрдВ, рдирд┐: рд╢реБрд▓реНрдХ рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд @ рдирд╛рдо рд╡рд╛рд▓реЗ рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреНрд░рдо рдореЗрдВ рдЯрд╛рдЗрдк рдП рдпрд╛ рдмреА рдХреЗ рд╕рд╛рде рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрдирдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд рдЙрдореНрдореАрджрд╡рд╛рд░ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд╣ рд╕рдм рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рднреА рдСрдкрд░реЗрдЯрд░реЛрдВ рдиреЗ рдПрдХ рд╣реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛: рдСрдкрд░реЗрд╢рди <<< рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рдерд╛ред

рдирд┐рдпрдореЛрдВ рдХрд╛ рдРрд╕рд╛ рд╕рд░рд▓ рд╕реЗрдЯ рд╕реАрдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИред рд╕рднреА рдСрдкрд░реЗрдЯрд░ рдмрд┐рд▓реНрдХреБрд▓ рд╕реНрд╡рддрдВрддреНрд░ рдФрд░ рд╕рдорддреБрд▓реНрдп рд╣реИрдВред рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рд╣рдо рдордиреБрд╖реНрдпреЛрдВ рдХреЗ рдмреАрдЪ рдореВрд▓рднреВрдд рд╕рдВрдмрдВрдз рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдЬрд╛рдирддреЗ рд╣реИрдВ == рдФрд░ ! = рд╕рдВрдЪрд╛рд▓рдиред рднрд╛рд╖рд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдпрд╣ рдПрдХ рд╣реИ рдФрд░ рдПрдХ рд╣реА рд╣реИред рд╣рдо рдореБрд╣рд╛рд╡рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдСрдкрд░реЗрдЯрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ ! = Through == :

 bool operator==(A const&, A const&); bool operator!=(A const& lhs, A const& rhs) { return !(lhs == rhs); } 

рдЗрд╕реА рддрд░рд╣, рдСрдкрд░реЗрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ < рд╣рдо рдЕрдиреНрдп рд╕рднреА рд╕рдВрдмрдВрдз рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдЗрди рдореБрд╣рд╛рд╡рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рднрд╛рд╖рд╛ рдХреЗ рдирд┐рдпрдореЛрдВ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рднреА рдЫрд╣ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд╕рдордХрдХреНрд╖ рдирд╣реАрдВ рдорд╛рдирддреЗ рд╣реИрдВред рд╣рдо рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рджреЛ рдмреБрдирд┐рдпрд╛рджреА рд╣реИрдВ ( == рдФрд░ < ), рдФрд░ рдЙрдирдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдиреНрдп рд╕рднреА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡реНрдпрдХреНрдд рдХрд┐рдП рдЧрдП рд╣реИрдВред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдорд╛рдирдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЗрди рджреЛ рдСрдкрд░реЗрдЯрд░реЛрдВ рдкрд░ рдмрдирд╛рдИ рдЧрдИ рд╣реИ, рдФрд░ рд╢реЛрд╖рд┐рдд рдХреЛрдб рдореЗрдВ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдЙрдирдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдпрд╛ рджреЛрдиреЛрдВ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдПрдВ рд╣реИрдВред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рджреЛ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдЖрдзрд╛рд░ рдХреА рднреВрдорд┐рдХрд╛ рдХреЗ рд▓рд┐рдП < рдСрдкрд░реЗрдЯрд░ рдмрд╣реБрдд рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИред

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

рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд░рд╡реИрдпрд╛ рдЯреНрд░рд╛рдЗрдХреЛрдЯреЙрдореА рдХреА рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдорд╛рд▓рд┐рдХ рдирд╣реАрдВ рд╣реИ? рдпрд╣ рдЖрдВрд╢рд┐рдХ рдЖрджреЗрд╢ рд╕рдВрдмрдВрдзреЛрдВ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ рдЙрджрд╛рд╣рд░рдг рдлреНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рдирдВрдмрд░ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рднреА рдСрдкрд░реЗрд╢рди 1.f <NaN , 1.f == NaN рдФрд░ 1.f> NaN рдЧрд▓рдд рд╣реИ ред рдЗрд╕рд▓рд┐рдП, 1.f <= NaN рднреА рдПрдХ рдЭреВрда рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ ! (NaN <1.f) рд╕рдЪ рд╣реИ ред

рдореВрд▓ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд╢рдмреНрджреЛрдВ рдореЗрдВ <= рдСрдкрд░реЗрдЯрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рджреЛрдиреЛрдВ рд╕рдВрдЪрд╛рд▓рди рдХреЛ (== рдмреА) рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рддреНрд░рд┐рдд рдХрд░рдирд╛ рд╣реИ (рдП <рдмреА) , рдЬреЛ рдПрдХ рдмрдбрд╝рд╛ рдХрджрдо рд╣реИ, рдЕрдЧрд░ рд╣рдореЗрдВ рдЕрднреА рднреА рд░реИрдЦрд┐рдХ рдХреНрд░рдо рд╕реЗ рдирд┐рдкрдЯрдирд╛ рд╣реИ, рддрдм рд╕реЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд╣реАрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рджреЛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "abc..xyz9" <= "abc" ..xyz1 " рдХреЛ (" abc..xyz9 "==" abc..xyz1 ")" ("abc..xyz9" <"abc..xyz1") рдХреЗ рд░реВрдк рдореЗрдВ рдФрд░ рд╕рдВрдкреВрд░реНрдг рдкрдВрдХреНрддрд┐ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдмрд╛рд░ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ ред

рджреВрд╕рд░реА рдмрд╛рдд, рд▓реЗрдХреНрд╕рд┐рдХреЛрдЧреНрд░рд╛рдлрд┐рдХ рддреБрд▓рдирд╛рдУрдВ рдореЗрдВ рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЦрд╝рд╛рд╕рд┐рдпрдд рдХреЗ рдХрд╛рд░рдг рдСрдкрд░реЗрдЯрд░ < рдореВрд▓ рднреВрдорд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИред рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЕрдХреНрд╕рд░ рдпрд╣ рдЧрд▓рддреА рдХрд░рддреЗ рд╣реИрдВ:

 struct A { T t; U u; bool operator==(A const& rhs) const { return t == rhs.t && u == rhs.u; } bool operator< (A const& rhs) const { return t < rhs.t && u < rhs.u; } }; 

рддрддреНрд╡реЛрдВ рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд▓рд┐рдП == рдСрдкрд░реЗрдЯрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ рд╕рджрд╕реНрдп рдХреЛ рдПрдХ рдмрд╛рд░ == рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ < рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рд╕реЗрдЯ A {1, 2} рдФрд░ A {2, 1} рдХреЛ рд╕рдорддреБрд▓реНрдп рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛ (рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдЕрдиреНрдп рд╕реЗ рдХрдо рдирд╣реАрдВ рд╣реИ)ред рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдВрддрд┐рдо рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдкреНрд░рддреНрдпреЗрдХ рд╕рджрд╕реНрдп рдХреЛ рджреЛ рдмрд╛рд░ < рдСрдкрд░реЗрдЯрд░ рд▓рд╛рдЧреВ рдХрд░реЗрдВ:

 bool operator< (A const& rhs) const { if (t < rhs.t) return true; if (rhs.t < t) return false; return u < rhs.u; } 

рдЕрдВрдд рдореЗрдВ, рд╡рд┐рд╖рдо рд╡рд╕реНрддреБрдУрдВ рдХреА рддреБрд▓рдирд╛ рдХреЗ рд╕рд╣реА рд╕рдВрдЪрд╛рд▓рди рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП - рдЕрд░реНрдерд╛рддреНред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ a == 10 рдФрд░ 10 == рдХрд╛ рдПрдХ рд╣реА рдорддрд▓рдм рд╣реИ - рд╡реЗ рдЖрдорддреМрд░ рдкрд░ рддреБрд▓рдирд╛рддреНрдордХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдореБрдлреНрдд рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдРрд╕реА рддреБрд▓рдирд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рд╣реИред рдпрд╣ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдЗрд╕ рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреЗ рдЕрдиреБрдкрд╛рд▓рди рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреА рд╣реЛрдЧреА, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдЖрдкрдХреЛ рдЖрдорддреМрд░ рдкрд░ рдРрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЫрд┐рдкреЗ рд╣реБрдП рджреЛрд╕реНрддреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдиреА рд╣реЛрдЧреА (рдЕрд░реНрдерд╛рдд рд╡рд░реНрдЧ рдирд┐рдХрд╛рдп рдХреЗ рдЕрдВрджрд░)ред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╕рдордп рдСрдкрд░реЗрдЯрд░ == (X, int) рд▓рд┐рдЦрдирд╛ рд╣рдореЗрд╢рд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ; рд╡реЗ рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдХрд╛ рднреА рдЕрд░реНрде рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ int рдХреЛ X рдирд┐рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЖрдЗрдП рдирд┐рдпрдореЛрдВ рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ C ++ 20 рдорд╛рдирдХ рдкрд░ рд▓рд╛рдПрдВ:

  • рд╕рднреА рдмрдпрд╛рдиреЛрдВ рдХреЛ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред
  • рд╣рдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдореБрд╣рд╛рд╡рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдСрдкрд░реЗрдЯрд░реЛрдВ == рдФрд░ < рд╣рдо рдореВрд▓ рдореБрд╣рд╛рд╡рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рд╢реЗрд╖ рд░рд┐рд╢реНрддреЗ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдЙрдирдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡реНрдпрдХреНрдд рдХрд░рддреЗ рд╣реИрдВред
  • рдмрд╕ рдСрдкрд░реЗрдЯрд░ < рдЖрдзрд╛рд░ рдХреА рднреВрдорд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИред
  • рдирд┐рд╢реНрд╢реБрд▓реНрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рд╖рдо рд╡рд╕реНрддреБрдУрдВ рдХреА рддреБрд▓рдирд╛ рд▓рд┐рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг (рдФрд░ рдЕрдиреБрд╢рдВрд╕рд┐рдд) рд╣реИред

рдирдпрд╛ рдореВрд▓ рдЖрджреЗрд╢ рдСрдкрд░реЗрдЯрд░: <=>


C ++ 20 рдореЗрдВ рддреБрд▓рдирд╛ рдХреЗ рдХрд╛рдо рдореЗрдВ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдФрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдкрд░рд┐рд╡рд░реНрддрди рдПрдХ рдирдП рдСрдкрд░реЗрдЯрд░ - рдСрдкрд░реЗрдЯрд░ <=> рдХрд╛ рд╣реИ , рдЬреЛ рддреАрди-рддрд░рдлрд╝рд╛ рддреБрд▓рдирд╛ рдСрдкрд░реЗрдЯрд░ рд╣реИред

рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддреАрди рддрд░рд╣ рдХреА рддреБрд▓рдирд╛рдУрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ рдлрд╝рдВрдХреНрд╢рди рд╕реА рдореЗрдВ рд╕реАрдПрдорд╕реА / рд╕реНрдЯреНрд░реИрдореНрдк рдФрд░ рдмреБрдирд┐рдпрд╛рджреА_рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ :: рддреБрд▓рдирд╛ () рд╕реА ++ рдореЗрдВред рд╡реЗ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЗрдВрдЯ рдХрд╛ рдорд╛рди рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рдордирдорд╛рдирд╛ рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рдкрд╣рд▓рд╛ рддрд░реНрдХ рджреВрд╕рд░реЗ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, 0 рдпрджрд┐ рд╡реЗ рд╕рдорд╛рди рд╣реИрдВ, рдФрд░ рдПрдХ рдордирдорд╛рдирд╛ рдирдХрд╛рд░рд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛ рдЕрдиреНрдпрдерд╛ред

"рд╕реНрдкреЗрд╕рд╢рд┐рдк" рдСрдкрд░реЗрдЯрд░ рдПрдХ рдЕрдВрддрд░ рдореВрд▓реНрдп рдирд╣реАрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рддреБрд▓рдирд╛ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╡рд╕реНрддреБ, рдЬрд┐рд╕рдХрд╛ рдореВрд▓реНрдп рддреБрд▓рдирд╛ рдХреА рдЧрдИ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рддреАрди рдореБрдЦреНрдп рд╢реНрд░реЗрдгрд┐рдпрд╛рдВ рд╣реИрдВ:

  • strong_ordering : рдПрдХ рд░реЗрдЦреАрдп рдХреНрд░рдо рд╕рдВрдмрдВрдз рдЬрд┐рд╕рдореЗрдВ рд╕рдорд╛рдирддрд╛ рдХрд╛ рдЕрд░реНрде рд╣реИ рддрддреНрд╡реЛрдВ рдХреА рдкрд░рд╕реНрдкрд░ рд╡рд┐рдирд┐рдордп рдХреНрд╖рдорддрд╛ (рдпрд╛рдиреА (рдП <=> b) == strong_ordering :: рдмрд░рд╛рдмрд░ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ f (a) == (b) рд╕рднреА рдЙрдкрдпреБрдХреНрдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдзрд╛рд░рдг рдХрд░рддрд╛ рд╣реИ f "рдЙрдкрдпреБрдХреНрдд рдлрд╝рдВрдХреНрд╢рди" рд╢рдмреНрдж рдХреЛ рдЬрд╛рдирдмреВрдЭрдХрд░ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдкрд░рд┐рднрд╛рд╖рд╛ рдирд╣реАрдВ рджреА рдЧрдИ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрдирдореЗрдВ рдРрд╕реЗ рдХрд╛рд░реНрдп рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИрдВ рдЬреЛ рдЕрдкрдиреЗ рддрд░реНрдХреЛрдВ рдХреЗ рдкрддреЗ рдпрд╛ рдХреНрд╖рдорддрд╛ () рд╡реЗрдХреНрдЯрд░ рдХреА рд╡рд╛рдкрд╕реА рдХрд░рддреЗ рд╣реИрдВ, рдЖрджрд┐ рд╣рдо рдХреЗрд╡рд▓ "рдЖрд╡рд╢реНрдпрдХ" рдЧреБрдгреЛрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдЬреЛ рдмрд╣реБрдд рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╢рд░реНрдд рд░реВрдк рд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдо рдкреНрд░рдХрд╛рд░ рдХреЗ рдореВрд▓реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╡реЗрдХреНрдЯрд░ рдХрд╛ рдореВрд▓реНрдп рдЗрд╕рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИ рдореА рдПрд▓рд┐рдореЗрдВрдЯреНрд╕, рд▓реЗрдХрд┐рди рдЙрд╕рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ, рдЖрджрд┐)ред рдЗрд╕ рд╢реНрд░реЗрдгреА рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореВрд▓реНрдп рд╢рд╛рдорд┐рд▓ рд╣реИрдВ: strong_ordering :: рдЕрдзрд┐рдХ , рдордЬрдмреВрдд_рдСрд░реНрдбрд░рд┐рдВрдЧ :: рд╕рдорд╛рди рдФрд░ рдордЬрдмреВрдд_рдСрд░реНрдбрд░рд┐рдВрдЧ :: рдХрдо ред
  • weak_ordering : рдПрдХ рд░реИрдЦрд┐рдХ рдХреНрд░рдо рд╕рдВрдмрдВрдз рдЬрд┐рд╕рдореЗрдВ рд╕рдорд╛рдирддрд╛ рдХреЗрд╡рд▓ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдорддрд╛ рд╡рд░реНрдЧ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ рдЙрджрд╛рд╣рд░рдг рдХреЗрд╕ рдЕрд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧ рддреБрд▓рдирд╛ рд╣реИ, рдЬрдм рджреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрдордЬреЛрд░_рдСрд░реНрдбрд░рд┐рдВрдЧ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ :: рд╕рдорддреБрд▓реНрдп , рд▓реЗрдХрд┐рди рдХрдбрд╝рд╛рдИ рд╕реЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ (рдпрд╣ рдореВрд▓реНрдп рдирд╛рдо рдореЗрдВ рд╕рдорддреБрд▓реНрдп рд╢рдмреНрдж рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ)ред
  • рдЖрдВрд╢рд┐рдХ_рд╕рдВрдХреНрд░рдордг : рдЖрдВрд╢рд┐рдХ рдХреНрд░рдо рд╕рдВрдмрдВрдзред рдЗрд╕ рд╢реНрд░реЗрдгреА рдореЗрдВ, рдПрдХ рдФрд░ рдорд╛рди рдХреЛ рдЕрдзрд┐рдХ , рд╕рдорддреБрд▓реНрдп, рдФрд░ рдХрдо (рдЬреИрд╕реЗ рдХрд┐ рдХрдордЬреЛрд░_рдСрд░реНрдбрд░рд┐рдВрдЧ рдореЗрдВ ) рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд ("рдЕрд╡реНрдпрд╡рд╕реНрдерд┐рдд")ред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдЖрдВрд╢рд┐рдХ рдЖрджреЗрд╢ рд╕рдВрдмрдВрдзреЛрдВ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: 1.f <=> NaN рдорд╛рди рдХреЛ рдЖрдВрд╢рд┐рдХ_рдСрд░реНрдбрд░рд┐рдВрдЧ :: рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ ред

рдЖрдк рдореБрдЦреНрдп рд░реВрдк рд╕реЗ strong_ordering рд╢реНрд░реЗрдгреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ; рдпрд╣ рднреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЗрд╖реНрдЯрддрдо рд╢реНрд░реЗрдгреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 2 <=> 4 рдордЬрдмреВрдд_рдСрд░реНрдбрд░рд┐рдВрдЧ :: рдХрдо , рдФрд░ 3 <=> -1 рд░рд┐рдЯрд░реНрди рдордЬрдмреВрдд_рдСрд░реНрдбрд░рд┐рдВрдЧ :: рдЕрдзрд┐рдХ ред

рдЙрдЪреНрдЪрддрд░ рдХреНрд░рдо рдХреА рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЛ рдХрдордЬрд╝реЛрд░ рдХреНрд░рдо рдХреА рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдореЗрдВ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдпрд╛рдиреА, strong_ordering рдХрдордЬреЛрд░_рдЖрдХрд░реНрд╖рдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░реЗрдХ рд╣реИ )ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡рд░реНрддрдорд╛рди рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдВрдмрдВрдз рд╕рдВрд░рдХреНрд╖рд┐рдд рд╣реИ (рдпрд╛рдиреА, рдордЬрдмреВрдд_рдСрд░реНрдбрд░рд┐рдВрдЧ :: рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдХрдордЬреЛрд░_рд░реЛрдбрд┐рдВрдЧ :: рдмрд░рд╛рдмрд░ ) рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред

рддреБрд▓рдирд╛ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рд╢рд╛рдмреНрджрд┐рдХ 0 рд╕реЗ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ (рдХрд┐рд╕реА рднреА int рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдФрд░ int рдХреЗ рд╕рд╛рде 0 рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдмрд╕ рд╢рд╛рдмреНрджрд┐рдХ 0 рдХреЗ рд╕рд╛рде) рдЫрд╣ рддреБрд▓рдирд╛рддреНрдордХ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП:

 strong_ordering::less < 0 // true strong_ordering::less == 0 // false strong_ordering::less != 0 // true strong_ordering::greater >= 0 // true partial_ordering::less < 0 // true partial_ordering::greater > 0 // true // unordered -  ,   //       partial_ordering::unordered < 0 // false partial_ordering::unordered == 0 // false partial_ordering::unordered > 0 // false 

рдпрд╣ рд╢рд╛рдмреНрджрд┐рдХ 0 рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рд╣реИ рдХрд┐ рд╣рдо рд╕рдВрдмрдВрдз рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдПрдХ @ рдмреА рдЗрди рдСрдкрд░реЗрдЯрд░реЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП (рдП <=> рдмреА) @ 0 рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 2 <4 рдХреА рдЧрдгрдирд╛ (2 <=> 4) <0 рдХреЗ рд░реВрдк рдореЗрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдЬреЛ strong_ordering :: рдХрдо <0 рдореЗрдВ рдмрджрд▓ рдЬрд╛рддреА рд╣реИ рдФрд░ рдорд╛рди рдХреЛ рд╕рд╣реА рджреЗрддреА рд╣реИ ред

<=> рдСрдкрд░реЗрдЯрд░ рдмреЗрд╕ рдСрдкрд░реЗрдЯрд░ рдХреА рднреВрдорд┐рдХрд╛ рдХреЛ рдлрд┐рдЯ рдХрд░рддрд╛ рд╣реИ < рдСрдкрд░реЗрдЯрд░ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрд╛рдж рдХреА рджреЛрдиреЛрдВ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдЦрддреНрдо рдХрд░рддрд╛ рд╣реИред

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

рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЖрдВрд╢рд┐рдХ рдХреНрд░рдо рд╕рдВрдмрдВрдз рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬреЛ рдлреНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рд╕рдВрдЦреНрдпрд╛рдУрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдПрдХ NaN рд░рд╛рдЬреНрдп рдХреЛ рдПрдХ int рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ NaN рд╕рд┐рд░реНрдл рдПрдХ рдореВрд▓реНрдп рд╣реИ рдЬреЛ рдПрдХ рдСрд░реНрдбрд░ рдХрд┐рдП рдЧрдП рдЬреЛрдбрд╝реЗ рдХреЛ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреЛрдИ рдорд╛рди рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИред рдЖрдк рдЗрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП std :: рд╡реИрдХрд▓реНрдкрд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 struct IntNan { std::optional<int> val = std::nullopt; bool operator==(IntNan const& rhs) const { if (!val || !rhs.val) { return false; } return *val == *rhs.val; } partial_ordering operator<=>(IntNan const& rhs) const { if (!val || !rhs.val) { //  unordered   //     return partial_ordering::unordered; } // <=>   strong_ordering  int, //        partial_ordering return *val <=> *rhs.val; } }; IntNan{2} <=> IntNan{4}; // partial_ordering::less IntNan{2} <=> IntNan{}; // partial_ordering::unordered //     .    IntNan{2} < IntNan{4}; // true IntNan{2} < IntNan{}; // false IntNan{2} == IntNan{}; // false IntNan{2} <= IntNan{}; // false 

<= рдСрдкрд░реЗрдЯрд░ рд╕рд╣реА рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рд╣рдо рднрд╛рд╖рд╛ рдХреЗ рд╕реНрддрд░ рдкрд░ рд╣реА рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рд╡реНрдпрдХреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рджреВрд╕рд░реЗ, рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдПрдХ рдмрд╛рд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ <=> , рдЬреЛ рд▓реЗрдХреНрд╕реЛрдЧреНрд░рд╛рдлрд╝рд┐рдХ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рд╕реБрд╡рд┐рдзрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:
 struct A { T t; U u; bool operator==(A const& rhs) const { return t == rhs.t && u == rhs.u; } strong_ordering operator<=>(A const& rhs) const { //    //  t.   != 0 (..  t // ),    //   if (auto c = t <=> rhs.t; c != 0) return c; //     //    return u <=> rhs.u; }; 

P0515 , рдСрдкрд░реЗрдЯрд░ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдореВрд▓ рд╡рд╛рдХреНрдп <=>, рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВ ред

рдирдИ рдСрдкрд░реЗрдЯрд░ рд╕реБрд╡рд┐рдзрд╛рдПрдБ


рд╣рдо рдЕрдкрдиреЗ рдирд┐рдкрдЯрд╛рди рдореЗрдВ рд╕рд┐рд░реНрдл рдПрдХ рдирдпрд╛ рдСрдкрд░реЗрдЯрд░ рдирд╣реАрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдЕрдВрдд рдореЗрдВ, рдпрджрд┐ рд╕рдВрд░рдЪрдирд╛ рдП рдХреА рдШреЛрд╖рдгрд╛ рдХреЗ рд╕рд╛рде рдКрдкрд░ рджрд┐рдЦрд╛рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХреЗрд╡рд▓ рдпрд╣ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ x <y рдХреЗ рдмрдЬрд╛рдп рдЕрдм рд╣рдореЗрдВ рд▓рд┐рдЦрдирд╛ рд╣реИ (x <=> y) <0 рд╣рд░ рдмрд╛рд░, рдХреЛрдИ рднреА рдЗрд╕реЗ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

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

рдПрдХ рдмрд╛рд░ рдлрд┐рд░, рдореИрдВ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рджреВрдВрдЧрд╛ рдЬреЛ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╣реА рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рджреЗрдЦреА рдереА:
рд╕рдорд╛рдирддрд╛
рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдмрдирд╛рдиреЗ
рдмреБрдирд┐рдпрд╛рджреА
==
<=>
рдбреЗрд░рд┐рд╡реЗрдЯрд┐рд╡
! =
< , > , <= >> =

рдкреНрд░рддреНрдпреЗрдХ рдореВрд▓ рдФрд░ рд╡реНрдпреБрддреНрдкрдиреНрди рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдПрдХ рдирдИ рдХреНрд╖рдорддрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реБрдИ, рдЬрд┐рд╕реЗ рдореИрдВ рдЖрдЧреЗ рдХреБрдЫ рд╢рдмреНрдж рдХрд╣реВрдВрдЧрд╛ред

рдмреБрдирд┐рдпрд╛рджреА рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рдЙрд▓рдЯрд╛


рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдПрдХ рдкреНрд░рдХрд╛рд░ рд▓реЗрдВ рдЬрд┐рд╕реЗ рдХреЗрд╡рд▓ int рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 struct A { int i; explicit A(int i) : i(i) { } bool operator==(int j) const { return i == j; } }; 

рдкреБрд░рд╛рдиреЗ рдирд┐рдпрдореЛрдВ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдпрд╣ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ a == 10 рдХрд╛рдо рдХрд░рддреА рд╣реИ рдФрд░ a.operator == (10) рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддреА рд╣реИред

рд▓реЗрдХрд┐рди рдХреНрдпрд╛ 10 == рдП рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ? C ++ 17 рдореЗрдВ, рдЗрд╕ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рддреНрд░реБрдЯрд┐ рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛ред рдРрд╕рд╛ рдХреЛрдИ рдСрдкрд░реЗрдЯрд░ рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдХреЛрдб рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рд╕рдордорд┐рдд рдСрдкрд░реЗрдЯрд░ == рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдкрд╣рд▓реЗ рдЗрдВрдЯ рдХрд╛ рдорд╛рди рд▓реЗрдЧрд╛, рдФрд░ рдлрд┐рд░ рдП ... рдФрд░ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐: рд╢реБрд▓реНрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрдирд╛ рд╣реЛрдЧрд╛ред

C ++ 20 рдореЗрдВ, рдореВрд▓ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдЙрд▓рдЯрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред 10 == рдП рдХреЗ рд▓рд┐рдП, рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдПрдХ рдЙрдореНрдореАрджрд╡рд╛рд░ рдСрдкрд░реЗрдЯрд░ рдорд┐рд▓реЗрдЧрд╛ == (рдП, рдЗрдВрдЯ) (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдПрдХ рд╕рджрд╕реНрдп рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рд▓реЗрдХрд┐рди рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЗрд╕реЗ рдПрдХ рдореБрдлреНрдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣рд╛рдВ рд▓рд┐рдЦрддрд╛ рд╣реВрдВ), рдФрд░ рдлрд┐рд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ - рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрд╕реНрдХрд░рдг, рдЕрд░реНрдерд╛рддреНред ред рдСрдкрд░реЗрдЯрд░ == (рдЗрдВрдЯ, рдП) ред рдпрд╣ рджреВрд╕рд░рд╛ рдЙрдореНрдореАрджрд╡рд╛рд░ рд╣рдорд╛рд░реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ (рдФрд░ рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ) рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдЪреБрдиреЗрдВрдЧреЗред C ++ 20 рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ 10 == a рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди a.operator == (10) рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдВрдХрд▓рдХ рд╕рдордЭрддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╛рдирддрд╛ рд╕рдордорд┐рдд рд╣реИред

рдЕрдм рд╣рдо рдЕрдкрдиреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВрдЧреЗ рддрд╛рдХрд┐ рдЗрд╕рдХреА рддреБрд▓рдирд╛ рди рдХреЗрд╡рд▓ рд╕рдорд╛рдирддрд╛ рдСрдкрд░реЗрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреА рдЬрд╛ рд╕рдХреЗ, рдмрд▓реНрдХрд┐ рдСрд░реНрдбрд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдСрдкрд░реЗрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреА рдХреА рдЬрд╛ рд╕рдХреЗ:

 struct A { int i; explicit A(int i) : i(i) { } bool operator==(int j) const { return i == j; } strong_ordering operator<=>(int j) const { return i <=> j; } }; 

рдлрд┐рд░, рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ <=> 42 рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреБрд░рд╛рдиреЗ рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред рдПрдУрдкрд░реЗрдЯрд░ <=> (42) рдХреЗ рд░реВрдк рдореЗрдВ , рд▓реЗрдХрд┐рди 42 <=> рд╕реА ++ 17 рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдЧрд▓рдд рд╣реЛрдЧрд╛, рднрд▓реЗ рд╣реА рдСрдкрд░реЗрдЯрд░ <ред => рднрд╛рд╖рд╛ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИред рд▓реЗрдХрд┐рди C ++ 20 рдореЗрдВ, рдСрдкрд░реЗрдЯрд░ <=> , рдСрдкрд░реЗрдЯрд░ == рдХреА рддрд░рд╣, рд╕рдордорд┐рдд рд╣реИ: рдпрд╣ рдЙрд▓реНрдЯреЗ рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ рдХреЛ рдкрд╣рдЪрд╛рдирддрд╛ рд╣реИред 42 <=> рдП рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рджрд╕реНрдп рдлрд╝рдВрдХреНрд╢рди рдСрдкрд░реЗрдЯрд░ <=> (рдП, рдЗрдВрдЯ) рдкрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдлрд┐рд░ рд╕реЗ, рдореИрдВ рдЗрд╕реЗ рдпрд╣рд╛рдВ рдореБрдлреНрдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВ), рд╕рд╛рде рд╣реА рдПрдХ рд╕рд┐рдВрдереЗрдЯрд┐рдХ рдЙрдореНрдореАрджрд╡рд╛рд░ рдСрдкрд░реЗрдЯрд░ <=> (рдЗрдВрдЯ, рдП) ред рдпрд╣ рдЙрд▓рдЯрд╛ рд╕рдВрд╕реНрдХрд░рдг рдмрд┐рд▓реНрдХреБрд▓ рд╣рдорд╛рд░реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ - рд╣рдо рдЗрд╕реЗ рдЪреБрдирддреЗ рд╣реИрдВред

рд╣рд╛рд▓рд╛рдБрдХрд┐, 42 <=> a.operator <=> (42) рдХреЗ рд░реВрдк рдореЗрдВ рдЧрдгрдирд╛ рдирд╣реАрдВ рдХреА рдЧрдИ рд╣реИред рдпрд╣ рдЧрд▓рдд рд╣реЛрдЧрд╛ред рдпрд╣ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ 0 <=> a.operator <=> (42) рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддреА рд╣реИред рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд╕рд╣реА рдХреНрдпреЛрдВ рд╣реИред

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

рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд░рд┐рдХреЙрд░реНрдб рдХреЗрд╡рд▓ рдореВрд▓ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИ, рд▓реЗрдХрд┐рди рдбреЗрд░рд┐рд╡реЗрдЯрд┐рд╡ рдХреЗ рд▓рд┐рдП рдпрд╣ рдирд╣реАрдВ рд╣реИред рд╡рд╣ рд╣реИ:

 struct B { bool operator!=(int) const; }; b != 42; // ok   C++17,   C++20 42 != b; //    C++17,   C++20 

рд╡реНрдпреБрддреНрдкрдиреНрди рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рдкреБрдирд░реНрд▓реЗрдЦрди


рдЖрдЗрдП рд╕рдВрд░рдЪрдирд╛ рдП рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ:

 struct A { int i; explicit A(int i) : i(i) { } bool operator==(int j) const { return i == j; } strong_ordering operator<=>(int j) const { return i <=> j; } }; 

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

рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЧрдгрд┐рдд рдореЗрдВ, рдСрдкрд░реЗрд╢рди ! = рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ == ред рдЕрдм рдпрд╣ рд╕рдВрдХрд▓рдХ рдХреЛ рдкрддрд╛ рд╣реИред рдП! = 17 рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП , рд╡рд╣ рди рдХреЗрд╡рд▓ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рджрд┐рдЦреЗрдЧрд╛ ! = рдСрдкрд░реЗрдЯрд░реНрд╕ , рдмрд▓реНрдХрд┐ рдСрдкрд░реЗрдЯрд░ == (рдФрд░, рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, рдЙрд▓реНрдЯреЗ рдСрдкрд░реЗрдЯрд░ == )ред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рд╕рдорд╛рдирддрд╛ рдСрдкрд░реЗрдЯрд░ рдорд┐рд▓рд╛ рдЬреЛ рд▓рдЧрднрдЧ рд╣рдореЗрдВ рд╕реВрдЯ рдХрд░рддрд╛ рд╣реИ - рд╣рдореЗрдВ рдмрд╕ рдЗрд╕реЗ рд╡рд╛рдВрдЫрд┐рдд рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛: a =! = 17 рдХреА рдЧрдгрдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдПрдЧреА ! (A == 17) ред

рдЗрд╕реА рддрд░рд╣, 17! = рдП рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ ! рдПрдСрдкрд░реЗрдЯрд░ == (17) , рдЬреЛ рдПрдХ рдкреБрдирд░реНрд▓реЗрдЦрди рдФрд░ рдЙрд▓рдЯрд╛ рд╕рдВрд╕реНрдХрд░рдг рджреЛрдиреЛрдВ рд╣реИред

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

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐, рдХреЙрд▓ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрдВрдкрд╛рдЗрд▓рд░ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗ рдЧрдП рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдирдпрд╛ рдХрд╛рд░реНрдп рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╡реЗ рдмрд╕ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрди рдХреЗрд╡рд▓ рд╕реНрд░реЛрдд рдХреЛрдб рд╕реНрддрд░ рдкрд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдЙрдкрд░реЛрдХреНрдд рдореБрдЭреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд▓рд╛рд╣ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ:

рдмреБрдирд┐рдпрд╛рджреА рд╡рд┐рдХрд▓реНрдк рдХреЗрд╡рд▓ : рдЕрдкрдиреЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдХреЗрд╡рд▓ рдореВрд▓ рдСрдкрд░реЗрдЯрд░реЛрдВ (== рдФрд░ <=>) рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред

рдЪреВрдВрдХрд┐ рдмреБрдирд┐рдпрд╛рджреА рдСрдкрд░реЗрдЯрд░ рддреБрд▓рдирд╛рдУрдВ рдХреЗ рдкреВрд░реЗ рд╕реЗрдЯ рдХреЛ рджреЗрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХреЗрд╡рд▓ рдЙрдиреНрд╣реЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдУрдВ (12 рдХреЗ рдмрдЬрд╛рдп) рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдУрдВ (6 рдХреЗ рдмрдЬрд╛рдп, рдЕрдм рдХреЗ рд░реВрдк рдореЗрдВ) рдФрд░ рдХреЗрд╡рд▓ 2 рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ 2 рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рд╕рдорд╛рдирддрд╛ рд╕рдВрдЪрд╛рд▓рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдУрдВ (4 рдХреЗ рдмрдЬрд╛рдп) рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ (2 рдХреЗ рдмрдЬрд╛рдп) рдФрд░ 1 рдлрд╝рдВрдХреНрд╢рди рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ 1 рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреЗрдВред Std :: sub_match рдХреНрд▓рд╛рд╕ рдПрдХ рдЪрд░рдо рдорд╛рдорд▓рд╛ рд╣реИ: C ++ 17 рдореЗрдВ рдпрд╣ 42 рддреБрд▓рдирд╛рддреНрдордХ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░ C ++ 20 рдореЗрдВ рдпрд╣ рдХреЗрд╡рд▓ 8 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдкреАрдбрд╝рд┐рдд рдирд╣реАрдВ рд╣реИред

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

рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдирд┐рдпрдо


рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, C ++ 17 рдореЗрдВ @ b рдХреЗ рд▓рд┐рдП рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ рдХреА рдЦреЛрдЬ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХреА рдЧрдИ рдереА: рд╣рдо рд╕рднреА рдСрдкрд░реЗрдЯрд░ @ рдСрдкрд░реЗрдЯрд░ рдкрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд рдПрдХ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВред

C ++ 20 рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ рдХреЗ рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЕрдм рд╣рдо рд╕рднреА рдСрдкрд░реЗрдЯрд░ @ рдЦреЛрдЬреЗрдВрдЧреЗ ред @@ рдХреЗ рд▓рд┐рдП рдЖрдзрд╛рд░ рдСрдкрд░реЗрдЯрд░ рд╣реЛ (рдпрд╣ рдПрдХ рд╣реА рдСрдкрд░реЗрдЯрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ)ред рд╣рдо рд╕рднреА рдСрдкрд░реЗрдЯрд░ @@ рднреА рдкрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рд╣рдо рдЗрд╕рдХрд╛ рдЙрд▓реНрдЯрд╛ рд╕рдВрд╕реНрдХрд░рдг рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдЗрди рд╕рднреА рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ рд╕реЗ, рд╣рдо рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдПрдХ рд╣реА рдкрд╛рд╕ рдореЗрдВ рдСрдкрд░реЗрдЯрд░ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИред рд╣рдо рд╡рд┐рднрд┐рдиреНрди рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдкрдиреНрди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдкрд╣рд▓реЗ рд╣рдо рдЙрди рд╕рднреА рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЙрдирдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдПрдХ рдЪреБрдирддреЗ рд╣реИрдВред рдпрджрд┐ рдпрд╣ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рддреЛ рдЦреЛрдЬ, рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рд╡рд┐рдлрд▓ рд░рд╣рддреА рд╣реИред

рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рд┐рдд рдЙрдореНрдореАрджрд╡рд╛рд░ рд╣реИрдВ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЕрдзрд┐рдХ рдЕрдирд┐рд╢реНрдЪрд┐рддрддрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

 struct C { bool operator==(C const&) const; bool operator!=(C const&) const; }; bool check(C x, C y) { return x != y; } 

C ++ 17 рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ x рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдЙрдореНрдореАрджрд╡рд╛рд░ рдерд╛ ! = Y , рдФрд░ рдЕрдм рддреАрди рд╣реИрдВ: x.operator! = (Y) ; X.operator == (y) рдФрд░ ! Y.operator == (x) ред рдХреНрдпрд╛ рдЪреБрдирдирд╛ рд╣реИ? рд╡реЗ рд╕рднреА рд╕рдорд╛рди рд╣реИрдВ! (рдиреЛрдЯ: рдЙрдореНрдореАрджрд╡рд╛рд░ y.operator! = (X) рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреЗрд╡рд▓ рдореВрд▓ рдСрдкрд░реЗрдЯрд░ рд╣реА рдЙрд▓рдЯреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ)ред

рдЗрд╕ рдЕрдирд┐рд╢реНрдЪрд┐рддрддрд╛ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдирд┐рдпрдо рдкреЗрд╢ рдХрд┐рдП рдЧрдП рд╣реИрдВред рдЕрд╕рдВрдмрджреНрдз рдЙрдореНрдореАрджрд╡рд╛рд░ рдЕрднрд┐рд╕рд░рдг рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИрдВ; . , x.operator!=(y) ┬л┬╗ !x.operator==(y) , ┬л┬╗ !y.operator==(x) . , ┬л┬╗ .

: operator@@ . . , .

-. тАФ (, x < y , тАФ (x <=> y) < 0 ), (, x <=> y void - , DSL), . . , bool ( : operator== bool , ?)

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

 struct Base { friend bool operator<(const Base&, const Base&); // #1 friend bool operator==(const Base&, const Base&); }; struct Derived : Base { friend void operator<=>(const Derived&, const Derived&); // #2 }; bool f(Derived d1, Derived d2) { return d1 < d2; } 

d1 < d2 : #1 #2 . тАФ #2 , , , . , d1 < d2 (d1 <=> d2) < 0 . , void 0 тАФ , . , - , #1 .


, , C++17, . , - . :

  • ( )
  • ,
  • , .

, . .

. , , , , , ( ). , :

1
2
a == b
b == a

a != b
!(a == b)
!(b == a)
a <=> b
0 <=> (b <=> a)

a < b
(a <=> b) < 0
(b <=> a) > 0
a <= b
(a <=> b) <= 0
(b <=> a) >= 0
a > b
(a <=> b) > 0
(b <=> a) < 0
a >= b
(a <=> b) >= 0
(b <=> a) <= 0

┬л ┬╗ , , .. a < b 0 < (b <=> a) , , , .


C++17 . . :

 struct A { T t; U u; V v; bool operator==(A const& rhs) const { return t == rhs.t && u == rhs.u && v == rhs.v; } bool operator!=(A const& rhs) const { return !(*this == rhs); } bool operator< (A const& rhs) const { //    ,     , //     ?:  &&/|| if (t < rhs.t) return true; if (rhs.t < t) return false; if (u < rhs.u) return true; if (rhs.u < u) return false; return v < rhs.v; } bool operator> (A const& rhs) const { return rhs < *this; } bool operator<=(A const& rhs) const { return !(rhs < *this); } bool operator>=(A const& rhs) const { return !(*this < rhs); } }; 

- std::tie() , .

, : :

 struct A { T t; U u; V v; bool operator==(A const& rhs) const { return t == rhs.t && u == rhs.u && v == rhs.v; } strong_ordering operator<=>(A const& rhs) const { //   T if (auto c = t <=> rhs.t; c != 0) return c; // ...  U if (auto c = u <=> rhs.u; c != 0) return c; // ...  V return v <=> rhs.v; } }; 

. <=> < . , . c != 0 , , ( ), .

. C++20 , :

 struct A { T t; U u; V v; bool operator==(A const& rhs) const = default; strong_ordering operator<=>(A const& rhs) const = default; }; 

, . , :

 struct A { T t; U u; V v; bool operator==(A const& rhs) const = default; auto operator<=>(A const& rhs) const = default; }; 

. , , :

 struct A { T t; U u; V v; auto operator<=>(A const& rhs) const = default; }; 

, , . : operator== , operator<=> .


C++20: . . , , , .


PVS-Studio , <=> . , -. , , (. " "). ++ .

PVS-Studio <, :

 bool operator< (A const& rhs) const { return t < rhs.t && u < rhs.u; } 

. , - . .

: Comparisons in C++20 .

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


All Articles