यह शुद्ध बुरा है। पहले हम स्वैप की घोषणा को देखने के लिए है:
bool operator[](size_type _Pos) const;
reference operator[](size_type _Pos);
यहाँ reference
bitset::reference
, प्रभावी रूप से एक प्रॉक्सी के रूप में कार्य करता है कि bitset
में एक नेस्टेड वर्ग है:
template<class T>
void swap(T &left, T &right);
अब, operator[]()
bitset
पर दो भार के है अंतर्निहित बिट्स में से एक के संदर्भ में। यह bitset
और bitset
में एक स्थिति है जो encapsulates है। swap
की घोषणा के कारण, दूसरा अधिभार चुना गया है और हम दो bitset::reference
एस स्वैप कर रहे हैं। अब यहां यह बुरा हो जाता है। के अदला-बदली का एक विशिष्ट कार्यान्वयन पर नजर डालते हैं:
template class<T> swap(T &left, T &right) {
T temp = left;
left = right;
right = temp;
}
समस्या यह है कि left
और right
एक bitset::reference
को दोनों संदर्भों को हो रहा है। उनके पास एक ही अंतर्निहित डेटा है (क्योंकि वे प्रॉक्सी हैं; वही अर्थ bitset
दोनों बिंदुओं के समान है!) वे bitset
में अलग-अलग स्थितियों को समाहित करते हैं।इस प्रकार, इस left
की तरह इस बारे में सोचेंऔर right
कुछ bitset
में स्थिति 1 है और bitset
के समान bitset
है! आइए हमेशा bitset
को BS
(जानबूझकर चुने गए) के रूप में देखें।
तो,
T temp = left;
कहते temp
BS
में स्थिति 0 है।
left = right;
सेट स्थिति 0 में BS
में स्थिति 1 के लिए छोड़ दिया (जो एक साथ स्थिति 0 बदलता है temp
में!)
right = temp;
सेट स्थिति 1 सही में (BS
में 0 जो सिर्फ करने के लिए स्थापित किया गया था स्थिति BS
में स्थिति 1!)। तो इस गड़बड़ी के अंत में यह स्थिति 0 है जो भी स्थिति 1 थी और स्थिति 1 अपरिवर्तित है! अब, क्योंकि स्थिति 0 एलएसबी है और स्थिति 1 एमएसबी है हमारे पास है कि "10" "11" बन जाता है। बदसूरत।
आप एक template specialization के साथ इस आसपास पहुंच सकते हैं:
namespace std {
template<>
void swap<bitset<2>::reference>(
bitset<2>::reference &left,
bitset<2>::reference &right
) {
bool temp = (bool)left;
left = (bool)right;
right = (bool)temp;
}
}
तब:
int main() {
bitset<2> test(string("10"));
cout << test; // Prints "10"
swap(test[0], test[1]);
cout << test; // Prints "01", hallelujah!
}
अच्छा काम! अविश्वसनीय रूप से सी ++ 0x भी बिट्ससेट के संबंध में 'स्वैप' का उल्लेख नहीं करता है। – Potatoswatter
क्या यह वास्तव में संकलित करता है? 'परीक्षण [0]' एक अस्थायी है कि आप इसका संदर्भ नहीं ले सकते ... – Barry