नहीं - सिर्फ उदाहरण के लिए, यदि आप टी == है (नाव | डबल | लंबे डबल), अपने operator==
सही काम नहीं करता। दो NaN को बराबर की तुलना कभी नहीं की जानी चाहिए, भले ही उनके पास समान बिट पैटर्न हो (वास्तव में, NaN का पता लगाने का एक आम तरीका स्वयं की संख्या की तुलना करना है - यदि यह स्वयं के बराबर नहीं है, तो यह एक NaN है)। इसी तरह, 0 पर सेट किए गए उनके एक्सपोनेंट्स में सभी बिट्स के साथ दो फ़्लोटिंग पॉइंट नंबर मान 0.0 (बिल्कुल) हैं, इस पर ध्यान दिए बिना कि बिट्स को महत्व में सेट/स्पष्ट किया जा सकता है।
आपके operator<
में सही तरीके से काम करने का भी कम मौका है। उदाहरण के लिए, कि कुछ इस तरह दिखता std::string
का एक विशिष्ट कार्यान्वयन पर विचार करें: सदस्यों की इस आदेश के साथ
template <class charT>
class string {
charT *data;
size_t length;
size_t buffer_size;
public:
// ...
};
, अपने operator<
इसके बफ़र्स जहां तार होने के पते के आधार पर तुलना संगृहीत करना है कि उनके डेटा। यदि, उदाहरण के लिए, यह पहले length
सदस्य के साथ लिखा गया था, तो आपकी तुलना तारों की लंबाई प्राथमिक कुंजी के रूप में उपयोग करेगी।किसी भी मामले में, यह वास्तविक स्ट्रिंग सामग्री के आधार पर तुलना नहीं करेगा, क्योंकि यह केवल data
पॉइंटर के मान को देखेगा, जो कुछ भी इस बिंदु पर नहीं है, जो आप वास्तव में चाहते हैं/चाहते हैं।
संपादित करें: जहां तक पैडिंग चलती है, वहां कोई आवश्यकता नहीं है कि पैडिंग की सामग्री बराबर हो। यह पैडिंग के लिए सैद्धांतिक रूप से संभव है कि किसी प्रकार का जाल प्रतिनिधित्व हो जो सिग्नल का कारण बनता है, अपवाद फेंकता है, या उस क्रम पर कुछ होता है, अगर आप इसे बिल्कुल भी देखने की कोशिश करते हैं। ऐसे जाल के प्रतिनिधित्व से बचने के लिए, आपको इसे unsigned char
एस के बफर के रूप में देखने के लिए कलाकार की तरह कुछ उपयोग करने की आवश्यकता है। memcmp
कि कर सकते हैं, लेकिन फिर यह नहीं हो सकता है ...
भी ध्यान रखें कि वस्तुओं के एक ही प्रकार से किया जा रहा करता नहीं जरूरी उपयोग के सदस्यों का एक ही संरेखण मतलब है। यह कार्यान्वयन का एक आम तरीका है, लेकिन यह एक संकलक के लिए अलग-अलग संरेखणों का उपयोग करने जैसा कुछ भी करने के लिए पूरी तरह से संभव है, इस पर आधारित है कि यह कितनी बार "सोचता है" किसी विशेष वस्तु का उपयोग किया जाएगा, और में ऑब्जेक्ट (उदाहरण के लिए, पहले पैडिंग बाइट में लिखा गया मान) जो इस विशेष उदाहरण के लिए संरेखण को बताता है। इसी तरह, यह ऑब्जेक्ट को (उदाहरण के लिए) पते से अलग कर सकता है, इसलिए किसी भी पते पर स्थित एक ऑब्जेक्ट में 2-बाइट संरेखण होता है, जिसमें चार में से एक के पास 4-बाइट संरेखण होता है, और इसी तरह (यह नहीं हो सकता है पीओडी प्रकारों के लिए प्रयोग किया जाता है, लेकिन अन्यथा, सभी दांव बंद हैं)।
इनमें से कोई भी संभावित या आम नहीं है, लेकिन ऑफहैंड मैं मानक में कुछ भी नहीं सोच सकता जो उन्हें प्रतिबंधित करता है।
आप ऐसा क्यों करना चाहते हैं? इसके बिना, यदि आपके पास ऑपरेटर की तुलना में समानता या कम नहीं है तो आपको एक सुविधाजनक सुविधाजनक संकलन त्रुटि मिल जाएगी। इसके साथ, संकलन त्रुटि चली गई है, और आप चुपचाप गलत ऑपरेटरों की संभावना है। आप ध्यान से इस तरह की बग बना रहे हैं कि उन्हें आसानी से नहीं देखा जाएगा। –
http://rxwen.blogspot.com/2009/12/use-memcmp-to-compare-objects.html – DumbCoder
@ डेविड: मैं निश्चित रूप से इसे वास्तविक कोड में उपयोग नहीं करता, लेकिन यह अटकलों को चोट नहीं पहुंचा सकता । –