มีค่าหนึ่งพันคำ:
#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)
สร้างวิธีการซึ่งทำให้เกิดปัญหาเดียวกัน (google ข้อผิดพลาดข้างต้น) โดยไม่มีเหตุผลที่ดี
คำถาม
อย่างไรก็ตามมีการแก้ไขปัญหานี้ในด้านคลาสดังนั้นผู้ใช้ API ไม่รู้สึกว่าสิ่งนี้และตรวจพบข้อผิดพลาดในเวลารวบรวม?
นั่นคือการเพิ่มเกินพิกัด
void operator[](size_t t) {
throw std::runtime_error("don't");
}
ไม่ใช่ทางออกที่ดี
operator[]()
ที่ยอมรับการint
โต้แย้งและไม่ได้กำหนดไว้