मेरे पास एक सूचक के लिए एक अंतर्निहित रूपांतरण ऑपरेटर वाला वर्ग है। उस सूचक को हटाना मान्य नहीं है। जब delete[]
ऑपरेटर के साथ प्रयोग किया जाता है तो क्या मैं एक पॉइंटर में रूपांतरण को रोक सकता हूं? मुझे एक संकलन समय त्रुटि चाहिए। free
फ़ंक्शन के लिए, मैं एक अधिभार को हटा सकता हूं जो कक्षा को तर्क के रूप में लेता है।
void foobar(double*){}
struct A {
// Please pretend I have a good reason for doing this.
operator double*() const { return nullptr; }
};
void free(A&) = delete;
int main(){
A a;
// Just works TM
foobar(a);
// This compiles :(
delete[] a;
// This does not :)
//free(a);
return 0;
}
मुझे लगता है कि वांछित प्रभाव के लिए कुछ चतुर की आवश्यकता होगी।
निहित रूपांतरण के लिए उपयोग का मामला: कहें A
एक स्कोप्ड सरणी लागू करता है। रूपांतरण A
को आवंटन/डीलोक जोड़ी के प्रतिस्थापन में लगभग एक बूंद बनाता है। स्पष्ट रूपांतरण की आवश्यकता वाले टेम्प्लेट और इटरेटर। अन्यथा c- जैसे कार्यों की कॉल साइट अपरिवर्तित रहती हैं।
2 जवाब
वर्कअराउंड के रूप में, आप रूपांतरण को अस्पष्ट बनाकर delete[]
ऑपरेटर के साथ उपयोग किए जाने पर पॉइंटर में रूपांतरण को रोक सकते हैं।
हालांकि, बाकी कोड की स्थिति के आधार पर, यह वांछित उपयोग के मामलों के लिए अवांछनीय अस्पष्टता पैदा कर सकता है।
struct A {
operator double*() const { return nullptr; }
operator void*() const { return nullptr; }
};
जब भी संकलन समय पर कुछ रोकने की बात आती है तो आप टेम्पलेट्स का उपयोग करने के बारे में सोच सकते हैं।
void foobar(double*){}
class A {
// Please pretend I have a good reason for doing this.
public :
operator double*() const { return nullptr; }
template<typename type>
void operator delete[] (void*, type size);
};
template<typename type>
void free(void*);
template<>
void free<A>(void*) = delete;
int main(){
A a;
// Just works TM
foobar(a);
// Now this will not compile to ! :(
delete[] a;
// This does not :)
//free(a);
return 0;
}
संबंधित सवाल
नए सवाल
c++
C ++ एक सामान्य-प्रयोजन प्रोग्रामिंग भाषा है। यह मूल रूप से C के विस्तार के रूप में डिज़ाइन किया गया था और इसमें एक समान सिंटैक्स है, लेकिन यह अब पूरी तरह से अलग भाषा है। C ++ कंपाइलर के साथ संकलित कोड के बारे में प्रश्नों के लिए इस टैग का उपयोग करें। विशिष्ट मानक संशोधन [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] या [C ++ 23], आदि से संबंधित प्रश्नों के लिए संस्करण-विशिष्ट टैग का उपयोग करें। ।