नीचे दिए गए कोड को देखें - मैं एक वेक्टर में एक कॉन्स ऑब्जेक्ट डालने की कोशिश कर रहा हूं। मुझे पता है कि जवाब है "एसटीएल कंटेनरों को ऑब्जेक्ट्स को असाइन करने योग्य और कॉपी करने योग्य की आवश्यकता होती है", लेकिन, मानक का हवाला देते हुए, क्या कोई यह समझा सकता है कि ऐसा करने में समस्या क्या है? मुझे समझ में नहीं आ रहा है कि इस तरह की एक वर्ग की प्रतिलिपि क्यों नहीं बनाई जा सकती (इसके अलावा सी ++ इसे अनुमति नहीं देता है)।आप एक एसटीएल कंटेनर में एक कॉन्स ऑब्जेक्ट क्यों नहीं डाल सकते?
यह सब एक मूल्य संग्रहीत है जिसे बदलने की अनुमति नहीं है - इसे वेक्टर में क्यों नहीं डाला जा सकता है बस इन वस्तुओं में से एक बनाते हैं?
#include <vector>
// Attempt 1
// /home/doriad/Test/Test.cxx:3:8: error: non-static const member ‘const int MyClass::x’, can’t use default assignment operator
// struct MyClass
// {
// int const x;
// MyClass(int x): x(x) {}
// };
//
// int main()
// {
// std::vector<MyClass> vec;
// vec.push_back(MyClass(3));
// return 0;
// }
// Attempt 2
// /home/doriad/Test/Test.cxx:28:23: error: assignment of read-only member ‘MyClass::x’
struct MyClass
{
int const x;
MyClass(int x): x(x) {}
MyClass& operator= (const MyClass& other)
{
if (this != &other)
{
this->x = other.x;
}
return *this;
}
};
int main()
{
std::vector<MyClass> vec;
vec.push_back(MyClass(3));
return 0;
}
संपादित करें:
यह std :: सेट और std :: सूची के साथ ऐसा करना संभव है। मुझे लगता है कि यह std :: वेक्टर में सॉर्ट() फ़ंक्शन है जो असाइनमेंट का उपयोग करता है। यह यूबी सही नहीं है?
#include <set>
// Attempt 1
struct MyClass
{
int const x;
MyClass(int x): x(x) {}
bool operator< (const MyClass &other) const;
};
bool MyClass::operator<(const MyClass &other) const
{
if(this->x < other.x)
{
return true;
}
else if (other.x < this->x)
{
return false;
}
}
int main()
{
std::set<MyClass> container;
container.insert(MyClass(3));
return 0;
}
सेमी से संबंधित: http://stackoverflow.com/questions/2759350/embarassing-c-question-regarding-const/2759426#2759426 – cHao
कृपया std :: vector के बजाय std :: set का उपयोग करके मेरा संपादन देखें। यह ठीक है? –
@ डेविड: सी ++ 03 में, 'std :: set <>' का उपयोग करके, अभी भी बीमार है - §23.1/3 जनादेश देता है कि तत्व प्रकार प्रतिलिपि बनाने योग्य _and_ असाइन करने योग्य होना चाहिए। सी ++ 11 में, आपका कोड अच्छी तरह से गठित है, लेकिन आपका 'std :: set <> 'उदाहरण असाइन करने योग्य नहीं होगा क्योंकि' MyClass' असाइन करने योग्य नहीं है। (इसके अलावा, केवल अर्ध-संबंधित: आपका 'ऑपरेटर <'कार्यान्वयन टूट गया है, क्योंकि यह' यह-> x == अन्य.एक्स') कोई मूल्य वापस नहीं करेगा। – ildjarn