最佳答案
千言万语:
#include<string>
#include<iostream>
class SayWhat {
public:
SayWhat& operator[](const std::string& s) {
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");
}
不是个好办法。