#include <iostream>
using namespace std;
class Foo {
enum OpState {
None ,
PlusState ,
NotState ,
};
public:
Foo& operator+() {
cout << "operator+()" << endl;
opState = PlusState;
return *this;
}
Foo& operator!() {
cout << "operator!()" << endl;
switch(opState) {
case PlusState:
operatorexclamativeplus();
opState = None;
break;
default:
opState = NotState;
break;
}
return *this;
}
private:
Foo& operatorexclamativeplus() {
cout << "operatorexclamativeplus()" << endl;
opState = None;
return *this;
}
Foo& operatorexclamativeplus(const Foo& rhs) {
cout << "operatorexclamativeplus(const Foo& rhs)" << endl;
opState = None;
return *this;
}
OpState opState;
};
int main() {
Foo x;
Foo z = !+x;
return 0;
}
CSNpbmNsdWRlIDxpb3N0cmVhbT4KCXVzaW5nIG5hbWVzcGFjZSBzdGQ7CgkKCWNsYXNzIEZvbyB7CgkgICAgZW51bSBPcFN0YXRlIHsKCSAgICAJTm9uZSAsCgkgICAgCVBsdXNTdGF0ZSAsCgkgICAgCU5vdFN0YXRlICwKCSAgICB9OwoJCglwdWJsaWM6CgkgICBGb28mIG9wZXJhdG9yKygpIHsKCSAgIAkgICBjb3V0IDw8ICJvcGVyYXRvcisoKSIgPDwgZW5kbDsKCSAgICAgICBvcFN0YXRlID0gUGx1c1N0YXRlOwoJICAgICAgIHJldHVybiAqdGhpczsKCSAgIH0KCSAgIEZvbyYgb3BlcmF0b3IhKCkgewoJICAgCSAgIGNvdXQgPDwgIm9wZXJhdG9yISgpIiA8PCBlbmRsOwoJICAgICAgIHN3aXRjaChvcFN0YXRlKSB7CgkgICAgICAgY2FzZSBQbHVzU3RhdGU6CgkgICAgICAgICAgIG9wZXJhdG9yZXhjbGFtYXRpdmVwbHVzKCk7CgkgICAgICAgICAgIG9wU3RhdGUgPSBOb25lOwoJICAgICAgICAgICBicmVhazsgICAgICAgCgkgICAgICAgZGVmYXVsdDoKCSAgICAgICAgICAgb3BTdGF0ZSA9IE5vdFN0YXRlOwoJICAgICAgICAgICBicmVhazsgICAgICAgCgkgICAgICAgfQoJICAgICAgIHJldHVybiAqdGhpczsKCSAgIH0KCQoJcHJpdmF0ZToKCSAgICBGb28mIG9wZXJhdG9yZXhjbGFtYXRpdmVwbHVzKCkgewoJICAgCSAgIGNvdXQgPDwgIm9wZXJhdG9yZXhjbGFtYXRpdmVwbHVzKCkiIDw8IGVuZGw7CiAgICAgICAgICAgb3BTdGF0ZSA9IE5vbmU7CgkgICAJICAgcmV0dXJuICp0aGlzOwoJICAgIH0KCSAgICBGb28mIG9wZXJhdG9yZXhjbGFtYXRpdmVwbHVzKGNvbnN0IEZvbyYgcmhzKSB7CgkgICAJICAgY291dCA8PCAib3BlcmF0b3JleGNsYW1hdGl2ZXBsdXMoY29uc3QgRm9vJiByaHMpIiA8PCBlbmRsOwogICAgICAgICAgIG9wU3RhdGUgPSBOb25lOwoJICAgCSAgIHJldHVybiAqdGhpczsKCSAgICB9CgkKCSAgICBPcFN0YXRlIG9wU3RhdGU7Cgl9OwoJCgkKCWludCBtYWluKCkgewoJCUZvbyB4OwoJCUZvbyB6ID0gISt4OwoJCXJldHVybiAwOwoJfQ==