यह सवाल सामान्य रूप से सी ++ के बारे में अधिक उचित रूप से पूछा जा सकता है, लेकिन जैसा कि मैं लिनक्स पर जीसीसी का उपयोग कर रहा हूं, यह संदर्भ है। निम्नलिखित कार्यक्रम पर विचार करें:सी ++: ऑपरेटर [] पर पहुंचने पर जीसीसी कॉन्स पर गैर-कॉन्स क्यों पसंद करता है?
#include <iostream>
#include <map>
#include <string>
using namespace std;
template <typename TKey, typename TValue>
class Dictionary{
public:
map<TKey, TValue> internal;
TValue & operator[](TKey const & key)
{
cout << "operator[] with key " << key << " called " << endl;
return internal[key];
}
TValue const & operator[](TKey const & key) const
{
cout << "operator[] const with key " << key << " called " << endl;
return internal.at(key);
}
};
int main(int argc, char* argv[])
{
Dictionary<string, string> dict;
dict["1"] = "one";
cout << "first one: " << dict["1"] << endl;
return 0;
}
जब कार्यक्रम को क्रियान्वित करने, उत्पादन होता है:
operator[] with key 1 called
operator[] with key 1 called
first one: one
मैं चाहते हैं क्या संकलक दूसरी कॉल में बजाय operator[]const
विधि का चयन करने के लिए है। इसका कारण यह है कि पहले [1 1]] इस्तेमाल किए बिना, operator[]
पर कॉल करने के लिए आंतरिक मानचित्र उस डेटा को बनाने का कारण बनता है जो अस्तित्व में नहीं है, भले ही केवल एक चीज जो मैं चाहता था वह कुछ डीबगिंग आउटपुट करना था, जो निश्चित रूप से है एक घातक आवेदन त्रुटि।
व्यवहार मैं सी # सूचकांक ऑपरेटर जो एक बात और एक सेट संचालन और जहां गेटर कुछ है कि अस्तित्व में नहीं है का उपयोग करने की कोशिश करता है तो आप एक अपवाद फेंक सकता है की तरह कुछ हो जाएगा रहा हूँ:
class MyDictionary<TKey, TVal>
{
private Dictionary<TKey, TVal> dict = new Dictionary<TKey, TVal>();
public TVal this[TKey idx]
{
get
{
if(!dict.ContainsKey(idx))
throw KeyNotFoundException("...");
return dict[idx];
}
set
{
dict[idx] = value;
}
}
}
इस प्रकार, मुझे आश्चर्य है कि जीसीसी ने कॉन्स्ट कॉल पर गैर-कॉन्स्ट कॉल क्यों पसंद किया है जब गैर-कॉन्स्ट एक्सेस की आवश्यकता नहीं है।
यह गैर-कॉन्स को तब तक कॉल करेगा जब तक कि एकमात्र संस्करण उपलब्ध न हो और जिसके परिणामस्वरूप "क्वालिफ़ायर को छोड़ दें" त्रुटि न हो। जाहिर है, संकलक जानता है कि कौन से संस्करण मौजूद हैं, इसलिए यह मेरे डेटा को नष्ट नहीं करने वाले व्यक्ति का भी उपयोग कर सकता है। मुझे व्यक्तिगत रूप से लगता है कि यह खराब संकलक व्यवहार है, इसलिए मुझे प्रबुद्ध करें। उन्होंने ऐसा क्यों किया जब दूसरी तरफ (गैर-कॉन्स को पसंद करने के लिए) सुरक्षित AFAICT है? – JonasW
सुरक्षित प्रतीत हो सकता है, लेकिन यह बहुत तार्किक नहीं है, * सर्वोत्तम * मिलान गैर-आधार है क्योंकि यह सटीक उसी प्रकार और स्थिरता का है। इसके बाद यह अन्य मैचों की तलाश कर सकता है। आम तौर पर यह कम से कम आश्चर्य में परिणाम। यदि आप कॉन्स सुरक्षा चाहते हैं, तो आपको इसे अपने समय के लिए –