Đáng giá ngàn lời nói:
#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;
}
Trình biên dịch không phàn nàn khi chuyển số 0 cho toán tử ngoặc chấp nhận chuỗi. Thay vào đó, điều này biên dịch và thất bại trước khi vào phương thức với:
terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_S_construct null not valid
Để tham khảo:
> 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)
Tôi đoán
Trình biên dịch đang ngầm sử dụng hàm std::string(0)
tạo để nhập phương thức, điều này dẫn đến cùng một vấn đề (google lỗi ở trên) không có lý do chính đáng.
Câu hỏi
Có cách nào để khắc phục điều này ở phía lớp không, vì vậy người dùng API không cảm thấy điều này và lỗi được phát hiện tại thời điểm biên dịch?
Đó là, thêm một quá tải
void operator[](size_t t) {
throw std::runtime_error("don't");
}
không phải là một giải pháp tốt.
operator[]()
chấp nhận int
đối số và không xác định nó.