এক হাজার শব্দ মূল্যবান:
#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)
পদ্ধতিতে প্রবেশের জন্য কনস্ট্রাক্টর ব্যবহার করছে , যা কোনও কারণ ছাড়াই একই সমস্যা (উপরের ত্রুটির গুগল) দেয়।
প্রশ্ন
ক্লাস সাইডে এটি ঠিক করার কোনও উপায় আছে, তাই API ব্যবহারকারী এটি অনুভব করে না এবং সংকলনের সময় ত্রুটিটি সনাক্ত করা যায়?
এটি একটি ওভারলোড যুক্ত করা হচ্ছে
void operator[](size_t t) {
throw std::runtime_error("don't");
}
একটি ভাল সমাধান নয়।
operator[]()
যে একটি int
যুক্তি গ্রহণ করে, এবং এটি সংজ্ঞায়িত করবেন না।