#include <iostream>
struct array
{
int i = 0;
array() {}
const int &operator[](size_t) const { std::cout << "const int[]\n"; return i; }
int &operator[](size_t) { std::cout << "int[]\n"; return i; }
};
int main()
{
array a;
a[0];
int v1 = a[0];
const int v2 = a[0];
std::cout << "refs\n";
int& v3 = a[0];
const int& v4 = a[0];
std::cout << "const array\n";
const array b;
b[0];
int v5 = b[0];
const int v6 = b[0];
std::cout << "refs\n";
//int& v7 = b[0]; // would produce a compile error
const int& v8 = b[0];
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IGFycmF5CnsKICAgIGludCBpID0gMDsKICAgIGFycmF5KCkge30KICAgIGNvbnN0IGludCAmb3BlcmF0b3JbXShzaXplX3QpIGNvbnN0IHsgc3RkOjpjb3V0IDw8ICJjb25zdCBpbnRbXVxuIjsgcmV0dXJuIGk7IH0KICAgIGludCAmb3BlcmF0b3JbXShzaXplX3QpIHsgc3RkOjpjb3V0IDw8ICJpbnRbXVxuIjsgcmV0dXJuIGk7IH0KfTsKCmludCBtYWluKCkKewogICAgYXJyYXkgYTsKICAgIGFbMF07CiAgICBpbnQgdjEgPSBhWzBdOwogICAgY29uc3QgaW50IHYyID0gYVswXTsKICAgIHN0ZDo6Y291dCA8PCAicmVmc1xuIjsKICAgIGludCYgdjMgPSBhWzBdOwogICAgY29uc3QgaW50JiB2NCA9IGFbMF07CiAgICBzdGQ6OmNvdXQgPDwgImNvbnN0IGFycmF5XG4iOwogICAgY29uc3QgYXJyYXkgYjsKICAgIGJbMF07CiAgICBpbnQgdjUgPSBiWzBdOwogICAgY29uc3QgaW50IHY2ID0gYlswXTsKICAgIHN0ZDo6Y291dCA8PCAicmVmc1xuIjsKICAgIC8vaW50JiB2NyA9IGJbMF07IC8vIHdvdWxkIHByb2R1Y2UgYSBjb21waWxlIGVycm9yCiAgICBjb25zdCBpbnQmIHY4ID0gYlswXTsKfQo=