#include <iostream>
#include <memory>
#include <stdexcept>
using namespace std;
class S
{
private:
int* data;
bool is_const;
public:
S() : data(new int[10]), is_const(false) { data[1] = 42; }
S(const S& other) : data(other.data), is_const(true) {}
S(S& other) : data(other.data), is_const(false) {}
int& operator()(size_t i)
{
if (is_const)
throw std::logic_error("non-const operation attempted");
return data[i];
}
const int& operator()(size_t i) const
{
return data[i];
}
};
int main() {
try
{
const S a; // Allocates memory
const S c(a);
cout << c(1) << endl;
S b(a); // Also points to memory allocated for a
b(1) = 3; // Generates an exception
cout << b(1) << endl; // never reached
}
catch (exception &e)
{
cout << "exception: " << e.what() << endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8c3RkZXhjZXB0Pgp1c2luZyBuYW1lc3BhY2Ugc3RkOwogCmNsYXNzIFMKewpwcml2YXRlOgoJaW50KiBkYXRhOwogICAgYm9vbCBpc19jb25zdDsKcHVibGljOgogICAgUygpIDogZGF0YShuZXcgaW50WzEwXSksIGlzX2NvbnN0KGZhbHNlKSB7IGRhdGFbMV0gPSA0MjsgfQogICAgUyhjb25zdCBTJiBvdGhlcikgOiBkYXRhKG90aGVyLmRhdGEpLCBpc19jb25zdCh0cnVlKSB7fQogICAgUyhTJiBvdGhlcikgOiBkYXRhKG90aGVyLmRhdGEpLCBpc19jb25zdChmYWxzZSkge30KCiAgICBpbnQmIG9wZXJhdG9yKCkoc2l6ZV90IGkpCiAgICB7CiAgICAJaWYgKGlzX2NvbnN0KQogICAgCQl0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCJub24tY29uc3Qgb3BlcmF0aW9uIGF0dGVtcHRlZCIpOwogICAgICAgIHJldHVybiBkYXRhW2ldOwogICAgfQogCiAgICBjb25zdCBpbnQmIG9wZXJhdG9yKCkoc2l6ZV90IGkpIGNvbnN0CiAgICB7CiAgICAgICAgcmV0dXJuIGRhdGFbaV07CiAgICB9Cn07CiAKaW50IG1haW4oKSB7Cgl0cnkKCXsKCSAgICBjb25zdCBTIGE7IC8vIEFsbG9jYXRlcyBtZW1vcnkKICAgIAljb25zdCBTIGMoYSk7CiAgICAJY291dCA8PCBjKDEpIDw8IGVuZGw7CiAgICAJUyBiKGEpOyAvLyBBbHNvIHBvaW50cyB0byBtZW1vcnkgYWxsb2NhdGVkIGZvciBhCiAgICAJYigxKSA9IDM7IC8vIEdlbmVyYXRlcyBhbiBleGNlcHRpb24KICAgIAljb3V0IDw8IGIoMSkgPDwgZW5kbDsgLy8gbmV2ZXIgcmVhY2hlZAoJfQoJY2F0Y2ggKGV4Y2VwdGlvbiAmZSkKCXsKCQljb3V0IDw8ICJleGNlcHRpb246ICIgPDwgZS53aGF0KCkgPDwgZW5kbDsKCX0KCXJldHVybiAwOwp9