सी ++ 20 में जिस तरह से रिलेशनल ऑपरेटर काम करते हैं, वह विशेष रूप से स्पेसशिप <=>
ऑपरेटर की शुरूआत के साथ बदला गया था । विशेष रूप से, यदि आप केवल प्रदान करते हैं operator==
, तो फिर a != b
से लिखा जाता है !(a == b)
।
से [over.match.oper] /3.4 :
लिखित उम्मीदवार का सेट निम्नानुसार निर्धारित किया गया है:
- रिलेशनल ([expr.rel]) ऑपरेटरों के लिए, फिर से लिखे गए उम्मीदवारों में एक्स <=> y के लिए सभी गैर-लिखित उम्मीदवारों को शामिल किया गया है।
- रिलेशनल ([expr.rel]) और तीन-तरफ़ा तुलना ([expr.spaceship]) ऑपरेटरों के लिए, फिर से लिखे गए उम्मीदवारों में एक संश्लेषित उम्मीदवार भी शामिल होता है, जिसके लिए दो मापदंडों के क्रम को उलट दिया जाता है, प्रत्येक गैर-लिखित उम्मीदवार के लिए अभिव्यक्ति y <=> x।
- (! = ऑपरेटर ([expr.eq])) के लिए, फिर से लिखे गए उम्मीदवारों में एक्स == y के लिए सभी गैर-लिखित उम्मीदवारों को शामिल किया गया है।
- समानता ऑपरेटरों के लिए, फिर से लिखे गए उम्मीदवारों में एक संश्लेषित उम्मीदवार भी शामिल होता है, जो कि दो y के लिए प्रत्येक गैर-पुनर्निर्मित उम्मीदवार के लिए प्रत्यावर्तित होता है।
- अन्य सभी ऑपरेटरों के लिए, लिखित उम्मीदवार सेट खाली है।
और [over.match.oper] / 9 :
यदि एक लिखित ऑपरेटर == उम्मीदवार को ऑपरेटर @ के लिए अधिभार संकल्प द्वारा चुना जाता है, तो उसका रिटर्न प्रकार cv बूल होगा, और x @ y के रूप में व्याख्या की जाती है:
- अगर @ है! = और चयनित उम्मीदवार मापदंडों के उलट क्रम के साथ एक संश्लेषित उम्मीदवार है; (y == x)!
- अन्यथा, अगर @ है! =; (x == y) ;
- अन्यथा (जब @ है ==), y == x,
चयनित पुनर्लेखन ऑपरेटर == उम्मीदवार का उपयोग करके प्रत्येक मामले में।
जैसे, अब एक स्पष्ट अधिभार operator!=
आवश्यक नहीं है। ऑपरेटर को हटाने से तुलनात्मक शब्दार्थ नहीं बदले हैं।
सभी कंटेनरों को operator!=
हटा दिया गया है, जहां तक मैं बता सकता हूं (जैसे वेक्टर सिनॉप्सिस की जांच करें )। एकमात्र अपवाद कंटेनर एडेप्टर हैं std::queue
और std::stack
: मेरा अनुमान है कि यह तीसरे पक्ष के कंटेनरों के साथ उपयोग किए जाने पर पीछे की संगतता को संरक्षित करने के लिए है, यदि समानता ऑपरेटर सममित नहीं हैं।