#include <iostream>
struct Foo{
int value = 0;
int& operator[](size_t i) {
std::cout << "non-const\n";
return value;
}
const int& operator[](size_t i) const {
std::cout << "const\n";
return const_cast<Foo*>(this)->operator[](i);
}
};
int main(){
const Foo g;
//g[0] = 3;
Foo f;
f[0];
}
I2luY2x1ZGUgPGlvc3RyZWFtPgpzdHJ1Y3QgRm9vewogICAgaW50IHZhbHVlID0gMDsKICAgIGludCYgb3BlcmF0b3JbXShzaXplX3QgaSkgewogICAgICAgIHN0ZDo6Y291dCA8PCAibm9uLWNvbnN0XG4iOwogICAgICAgIHJldHVybiB2YWx1ZTsKICAgIH0KCiAgICBjb25zdCBpbnQmIG9wZXJhdG9yW10oc2l6ZV90IGkpIGNvbnN0IHsKICAgICAgICBzdGQ6OmNvdXQgPDwgImNvbnN0XG4iOwogICAgICAgIHJldHVybiBjb25zdF9jYXN0PEZvbyo+KHRoaXMpLT5vcGVyYXRvcltdKGkpOwogICAgfQp9OwoKaW50IG1haW4oKXsKCWNvbnN0IEZvbyBnOwoJLy9nWzBdID0gMzsKCUZvbyBmOwoJZlswXTsKfQ==