कई मानक पुस्तकालय प्रकारों के लिए C ++ 20 में ऑपरेटर को क्यों हटाया गया है?


44

Cppreference के अनुसार , std::type_info::operator!=C ++ 20 के साथ हटा दिया जाता है, हालांकि, std::type_info::operator==स्पष्ट रूप से रहता है।

इसके पीछे क्या कारण है? मैं असमानता की तुलना को निरर्थक मानने पर सहमत हो सकता हूं, लेकिन फिर समानता के लिए तुलना करना भी उतना ही व्यर्थ होगा, ना?

इसी प्रकार, operator!=कई अन्य मानक पुस्तकालय प्रकारों में, जैसे कि कंटेनर std::unordered_map::operator!=और जैसे std::unordered_set::operator!=cppreference के अनुसार C ++ 20 में निकाले जाएंगे।

लिखने के if(!(id1 == id2))लिए किसी भी कोड की तुलना में कोई भी स्पष्ट नहीं करता है if(id1 != id2), इसके विपरीत, बस विपरीत ...

जवाबों:


62

सी ++ 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: मेरा अनुमान है कि यह तीसरे पक्ष के कंटेनरों के साथ उपयोग किए जाने पर पीछे की संगतता को संरक्षित करने के लिए है, यदि समानता ऑपरेटर सममित नहीं हैं।


7
p1614 ब्याज की भी हो सकती है, जैसा कि मेरा मानना ​​है कि यह प्रस्ताव था जिसने ओवरलोड को हटा दिया था।
एन।

39

हमें operator!=अब और लाइब्रेरी की आवश्यकता नहीं है। प्रदान operator==की अनुमति देता है संकलक कुछ करतब दिखाने करते हैं और मूल्यांकन करने के लिए a != bके मामले में a == b, अपने आप ही सब।

[Over.match.oper]

3 एक अपर ऑपरेटर के लिए @ एक प्रकार के ऑपरेंड के साथ जिसका cv-unqualified संस्करण T1 है, और एक बाइनरी ऑपरेटर के लिए @ एक प्रकार के बाएं ऑपरेंड के साथ जिसका cv-unqualified संस्करण T1 है और एक प्रकार का cv- का दायां किनारा अयोग्य संस्करण T2 है, उम्मीदवार कार्यों के चार सेट, नामित सदस्य उम्मीदवार, गैर-सदस्य उम्मीदवार, अंतर्निहित उम्मीदवार और फिर से लिखे गए उम्मीदवार, निम्नानुसार निर्मित हैं:

3.4.3 के लिए! = ऑपरेटर ([expr.eq]), फिर से लिखे गए उम्मीदवारों में एक्स == y के लिए सभी गैर-लिखित उम्मीदवार शामिल हैं।

std::type_infoऔर कई और पुस्तकालय प्रकारों को P1614 केoperator!= हिस्से के रूप में हटा दिया गया था - द मदरशिप लैंड हो गया है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.