मेरे पास एक सूचक के लिए एक अंतर्निहित रूपांतरण ऑपरेटर वाला वर्ग है। उस सूचक को हटाना मान्य नहीं है। जब 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
plswork04 27 अक्टूबर 2020, 23:17

2 जवाब

सबसे बढ़िया उत्तर

वर्कअराउंड के रूप में, आप रूपांतरण को अस्पष्ट बनाकर delete[] ऑपरेटर के साथ उपयोग किए जाने पर पॉइंटर में रूपांतरण को रोक सकते हैं।

हालांकि, बाकी कोड की स्थिति के आधार पर, यह वांछित उपयोग के मामलों के लिए अवांछनीय अस्पष्टता पैदा कर सकता है।

struct A {
  operator double*() const { return nullptr; }
  operator void*() const { return nullptr; }
};
2
Eljay 2 नवम्बर 2020, 18:29

जब भी संकलन समय पर कुछ रोकने की बात आती है तो आप टेम्पलेट्स का उपयोग करने के बारे में सोच सकते हैं।

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;
}
0
Ravi Prakash 4 नवम्बर 2020, 04:55