[indirect.relops] # 20 Memory management library [[mem]](./#mem) ## 20.4 Types for composite class design [[mem.composite.types]](mem.composite.types#indirect.relops) ### 20.4.1 Class template indirect [[indirect]](indirect#relops) #### 20.4.1.8 Relational operators [indirect.relops] [🔗](#itemdecl:1) `template constexpr bool operator==(const indirect& lhs, const indirect& rhs) noexcept(noexcept(*lhs == *rhs)); ` [1](#1) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L6666) *Mandates*: The expression *lhs == *rhs is well-formed and its result is convertible to bool[.](#1.sentence-1) [2](#2) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L6671) *Returns*: If lhs is valueless or rhs is valueless,lhs.valueless_after_move() == rhs.valueless_after_move(); otherwise *lhs == *rhs[.](#2.sentence-1) [🔗](#itemdecl:2) `template constexpr synth-three-way-result operator<=>(const indirect& lhs, const indirect& rhs); ` [3](#3) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L6687) *Returns*: If lhs is valueless or rhs is valueless,!lhs.valueless_after_move() <=> !rhs.valueless_after_move(); otherwise*synth-three-way*(*lhs, *rhs)[.](#3.sentence-1)