Senilai seribu kata:
#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;
}
Kompiler tidak mengeluh ketika meneruskan angka 0 ke operator braket menerima string. Sebaliknya, ini mengkompilasi dan gagal sebelum masuk ke metode dengan:
terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_S_construct null not valid
Sebagai referensi:
> 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)
Tebakanku
Kompiler secara implisit menggunakan std::string(0)
konstruktor untuk memasukkan metode, yang menghasilkan masalah yang sama (google the error di atas) tanpa alasan yang bagus.
Pertanyaan
Apakah ada cara untuk memperbaikinya di sisi kelas, sehingga pengguna API tidak merasakan ini dan kesalahan terdeteksi pada waktu kompilasi?
Artinya, menambahkan kelebihan
void operator[](size_t t) {
throw std::runtime_error("don't");
}
bukan solusi yang baik.
operator[]()
yang menerima int
argumen, dan jangan mendefinisikannya.