2014-09-20 4 views
6

दोनों मेरी compilers (छ ++ और बजना) इस संकलन नहीं होगा:असमानता के लिए वैक्टर की तुलना वेक्टर तत्वों पर केवल समानता ऑपरेटर का उपयोग करें। क्यूं कर?

#include <vector> 

struct A { 
    friend bool operator!=(A const& a1, A const& a2) { return false; } 
}; 

int main() 
{ 
    std::vector<A> v1, v2; 
    return (v1 != v2); 
} 

त्रुटि जा रहा है कि stl_algobase.h में कहीं !(*__first1 == *__first2) अमान्य है।

दूसरे शब्दों में, यह मौजूदा ऑपरेटर को पूरी तरह अनदेखा कर रहा है! = A का। यह कहने की जरूरत नहीं है कि अगर मैं operator== परिभाषित करता हूं तो यह संकलित करता है और काम करता है।

क्या यह मानक के अनुसार होना चाहिए?

यदि हां, तो क्यों?

+0

op == और op! = के लिए ओवरलोड स्वतंत्र हैं, और कोई भी स्वचालित रूप से परिभाषित नहीं किया जाएगा। मानक-लाइब्रेरी-लेखकों ने केवल उनमें से एक का उपयोग करने के लिए समझदार निर्णय लिया, और उपयोगकर्ताओं के लिए इसके संदर्भ में अन्य प्रदान किया। मानक कंटेनर पर – Deduplicator

+1

'ए! = बी''! (ए == बी) 'के बराबर निर्दिष्ट है, और' a == b' को 'std :: बराबर (a.begin(), ए के रूप में निर्दिष्ट किया गया है। अंत(), b.begin(), b.end()) ', जो तुलना के लिए' ==' का उपयोग करने के लिए निर्दिष्ट है। –

उत्तर

6

ऐसा इसलिए है क्योंकि the comparison operatorsEqualityComparable या LessThanComparable प्रकार चाहते हैं।

केवल == और < के साथ, आप बराबर !=, <=, >=, और > प्राप्त कर सकते हैं। दूसरे शब्दों में, केवल 2 ऑपरेटरों को लागू करने से, आप सभी 6 तुलना (यह मानते हुए मैं तर्क में कोई गलती नहीं की है) प्राप्त कर सकते हैं:

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

मानक कंटेनर आम तौर पर इस का उपयोग करें, और का उपयोग करेगा operator== और operator< जब प्रकार के लिए तुलना कर रहे हैं।

तो हाँ, ऐसा होना चाहिए जैसा कि होना चाहिए।

प्रश्न के दूसरे भाग के रूप में (क्यों), मैं वास्तव में पूरी तरह से यकीन नहीं क्यों अन्य ऑपरेटरों यदि उपलब्ध हो तो उपयोग नहीं किया जाता रहा हूँ।

+1

अब, यदि आपने समझाया कि क्यों दूसरों को स्वचालित रूप से संश्लेषित नहीं किया जाता है ... तो यह एक अच्छा जवाब बन सकता है। – Deduplicator

+0

@ टी.सी. .: अच्छा बिंदु, मैंने इसे जोड़ा। – Cornstalks

+1

आप उस समय होने पर '> =' को ठीक कर सकते हैं। इन ऑपरेटरों को लागू करने का सामान्य तरीका ['std :: rel_ops'] (http://en.cppreference.com/w/cpp/utility/rel_ops/operator_cmp) में देखा जा सकता है। ऐसा नहीं है कि कोई वास्तव में 'rel_ops' का उपयोग करता है ... – Blastfurnace

संबंधित मुद्दे