2017-10-03 12 views
14

अगर मैं एक vector<bool> vec_bool तो मैं |= असाइनमेंट ऑपरेटर का उपयोग कर वेक्टर की सामग्री को संशोधित नहीं कर सकते हैं। यही कारण है, लाइनोंसंयोजन असाइनमेंट ऑपरेटर क्यों करता है = = बूल के वैक्टरों के साथ काम नहीं करता है?

vec_bool[0] |= true; 
vec_bool[0] |= vec_bool[1]; 

दे संकलक त्रुटियों है, जबकि लाइनों

bool a = false; 
a |= true; 
a |= vec_bool[0]; 
vec_bool[0] = vec_bool[0] | vec_bool[1]; 
vec_bool[0] = vec_bool[0] || vec_bool[1]; 

vector<int> vec_int(3); 
vec_int[0] |= vec_int[1]; 

नहीं है। इसका कारण क्या है? bool& के लिए उपनाम

test.cpp:21:17: error: no match for ‘operator|=’ (operand types are ‘std::vector::reference {aka std::_Bit_reference}’ and ‘bool’)

+14

आपको याद रखना होगा कि ['std :: vector '] (http://en.cppreference.com/w/cpp/container/vector_bool) एक * साधारण * वेक्टर नहीं है। यह 'बूल' का वास्तविक वेक्टर नहीं है, लेकिन बिट्स के वेक्टर की तरह, जिसका कार्यान्वयन सी ++ विनिर्देशन द्वारा निर्दिष्ट नहीं है। –

+2

संभावित डुप्लिकेट [std :: vector में कोई .data() क्यों नहीं है?] (Https://stackoverflow.com/questions/46115669/why-does-stdvectorbool-has-no-data) –

+2

आप एक ले सकते हैं अधिक जानकारी के बारे में यह – cbuchart

उत्तर

18

referencestd::vector<bool> की operator[] से लौटे नहीं है, के रूप में यह std::vector के प्राथमिक विशेषज्ञता के लिए है:

(जीसीसी) के द्वारा दिए गए त्रुटि है। यह बल्कि C++ standard as this द्वारा निर्दिष्ट किया जाता:

// bit reference: 
class reference { 
    friend class vector; 
    reference() noexcept; 
public: 
    ~reference(); 
    operator bool() const noexcept; 
    reference& operator=(const bool x) noexcept; 
    reference& operator=(const reference& x) noexcept; 
    void flip() noexcept;  // flips the bit 
}; 

और जैसा कि आप देख सकते हैं, वहाँ कोई operator |= घोषित है। तो आप इसे vec_bool[0] से वापस संदर्भ पर लागू नहीं कर सकते हैं।

कारण vec_bool[0] = vec_bool[0] | vec_bool[1]; काम करता है कि ओवरलोड ऊपर हैं जो इसे सुविधाजनक बनाता है। operator bool()bool मूल्यों में निर्मित | की दो ऑपरेंड बदल देता है। और फिर reference का असाइनमेंट ऑपरेटर परिणाम को vec_bool[0] पर वापस सौंपता है।

सी ++ मानक द्वारा निर्दिष्ट के रूप में, std::vector<bool> नहीं एक विशेष रूप से अच्छा अमूर्त, IMO है।

+0

स्टोर नहीं करता है! क्या आप शायद मुझे बता सकते हैं कि 'वेक्टर ' वेक्टर का एकमात्र प्रकार है जो वेक्टर प्रकार के 'मानक' कार्यान्वयन से विचलित होता है? –

+6

@MeesdeVries - यह केवल एक ही है कि सी ++ मानक जनादेश प्राथमिक घोषणा से विचलित करने के लिए है। अन्य सभी जिन्हें आप प्राथमिक टेम्पलेट के रूप में मान सकते हैं। – StoryTeller

+3

... जो कहने के लिए है, अन्य प्रदर्शन कारणों से विशिष्ट हो सकते हैं, लेकिन आप पोर्टेबल कोड में इसका पता नहीं लगा सकते हैं। – MSalters

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