एक हजार शब्दों के लायक:
#include<string>
#include<iostream>
class SayWhat {
public:
SayWhat& operator[](const std::string& s) {
std::cout<<"here\n"; // To make sure we fail on function entry
std::cout<<s<<"\n";
return *this;
}
};
int main() {
SayWhat ohNo;
// ohNo[1]; // Does not compile. Logic prevails.
ohNo[0]; // you didn't! this compiles.
return 0;
}
संकलक को स्ट्रिंग स्वीकार करने वाले ब्रैकेट संचालक को नंबर 0 से पास करने पर कंपाइलर शिकायत नहीं कर रहा है। इसके बजाय, यह विधि के साथ प्रवेश करने से पहले संकलित करता है और विफल रहता है:
terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_S_construct null not valid
सन्दर्भ के लिए:
> g++ -std=c++17 -O3 -Wall -Werror -pedantic test.cpp -o test && ./test
> g++ --version
gcc version 7.3.1 20180303 (Red Hat 7.3.1-5) (GCC)
मेरा अनुमान
संकलक का उपयोग विधायक द्वारा std::string(0)
विधि में प्रवेश करने के लिए किया जाता है, जो बिना किसी अच्छे कारण के एक ही समस्या (उपरोक्त त्रुटि को गूगल करता है) पैदा करता है।
सवाल
क्या क्लास की तरफ से इसे ठीक करने के लिए कुछ भी है, इसलिए एपीआई उपयोगकर्ता को यह महसूस नहीं होता है और संकलन समय पर त्रुटि का पता लगाया जाता है?
यही है, एक अधिभार जोड़ना
void operator[](size_t t) {
throw std::runtime_error("don't");
}
एक अच्छा समाधान नहीं है।
operator[]()
एक int
तर्क को स्वीकार करता है, और इसे परिभाषित नहीं करता है।