천 단어의 가치 :
#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
하지 마십시오.