मैं किसी भी तरह से छिपाने वाले std::string::operator=(char)
ओवरलोड को बहिष्कृत करने के रूप में किसी भी तरह से अक्षम/चिह्नित करने की कोशिश कर रहा हूं (जो मेरे अनुभव में केवल तभी प्रयोग किया जाता है जब गलती से एक स्ट्रिंग को पूर्णांक आवंटित किया जाता है, और सूक्ष्म और बग को ट्रैक करना मुश्किल होता है)। यह* मेरी लाइब्रेरी में * मानक लाइब्रेरी * फ़ंक्शन/विधि को बहिष्कृत (या पूरी तरह अक्षम) के रूप में कैसे चिह्नित करें?
#include <string>
#include <type_traits>
template<> std::basic_string<char> &std::basic_string<char>::operator=(char c) {
static_assert(false, "Don't use this!");
}
जो विफल रहता है <string>
के रूप में पहले से ही std::string
[[deprecated]]
विशेषता का एक स्पष्ट इन्स्टेन्शियशन करता है में एक स्थिर ज़ोर साथ
एक स्पष्ट विशेषज्ञता,:
मैं के साथ की कोशिश की विभिन्न पदों में ऊपर की तरह एक समान घोषणा पर लागू; मैंने कोशिश की कोई भी स्थिति किसी भी उचित परिणाम देने के लिए लग रहा था;
=delete
, जो ऊपर के समान कारणों से विफल रहता है;- मैंने लिंकर ट्रिक्स का उपयोग करने के बारे में सोचा (इसी तरह के एक ही प्रोजेक्ट में,
--wrap
ld
लिंकर विकल्प का उपयोग करके उपयोग पर रनटाइम चेक है), लेकिन तथ्य यह है कि यह एक टेम्पलेट और इनलाइन विधि इस मामले को जटिल करता है।
अब सवाल:
- वहाँ किसी भी तरह निष्क्रिय करने के लिए (
=delete
साथ क्या होगा के रूप में) मानक पुस्तकालय में किसी भी समारोह या विधि एक मानक पद्धति है (पढ़ें: एक पुस्तकालय में आप जहां परिवर्तन नहीं कर सकते हेडर में घोषणाएं)? - उपरोक्त के रूप में, लेकिन, अक्षम होने की बजाय, एक चेतावनी जोड़ें (जैसा कि
[[deprecated]]
के साथ होगा); - मानक विधि में विफल, क्या कुछ g ++ - विशिष्ट है?
- यदि कोई "सामान्य" (= किसी भी विधि, किसी भी वर्ग, किसी भी फ़ंक्शन, ...) समाधान पर लागू होता है, तो क्या ऐसा कुछ है जिसे हम इस विशिष्ट मामले पर लागू कर सकते हैं (= टेम्पलेट वर्ग की विधि को अक्षम करें, संभवतः यहां तक कि सिर्फ एक विशिष्ट तात्कालिकता)?
$ g++ -O0 test.cpp -Wl,--wrap=_ZNSsaSEc
स्पष्टीकरण::
_ZNSsaSEc
अपने हमलावर समारोह का सजाया नाम है:$ echo _ZNSsaSEc | c++filt std::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator=(char)
यदि आप एक स्थैतिक जोर या हटाए गए फ़ंक्शन का उपयोग करने का प्रयास कर रहे हैं तो आपके पास "बहिष्कृत" की एक मजेदार परिभाषा है। –
@ जोनाथन वाक्ली: "पूरी तरह से बहिष्कृत या अक्षम"; लेकिन जहां तक मेरा संबंध है, यह अनिवार्य रूप से वही है, मैं शायद इस तरह की चेतावनी पर 'वायुयान' का उपयोग करूंगा, वैसे भी उस असाइनमेंट ऑपरेटर का उपयोग करने का कोई वैध कारण नहीं है (ठीक है क्योंकि इसका उपयोग करने का कोई कारण नहीं है, कहता है, 'मिलता है 'या स्ट्रिंग अक्षर = =' char * 'रूपांतरण विरासत कोड संगतता के अलावा)। –