1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | //rvalue classes and move function template <class T> struct r_ref { mutable T& ref; r_ref(T& rhs) :ref(rhs) {} r_ref(const r_ref& rhs) :ref(rhs.ref) {} }; template <class T> struct r_val : r_ref<T> { mutable T val; r_val(T& rhs) :r_ref<T>(val), val(rhs) {} r_val(const r_ref<T>& rhs) :r_ref<T>(val), val(rhs) {} }; template <class T> r_ref<T> move(T& rhs) {return r_ref<T>(rhs);} //demo classes #include <iostream> #include <string> class demo { public: std::string data; demo() : data("LONG STRING SO NO CHEATS") {std::cout<<"default construct\n";} demo(const demo& rhs) : data(rhs.data) {std::cout<<"copy construct\n";} demo(const r_ref<demo>& rhs) : data() {data.swap(rhs.ref.data); std::cout<<"move construct\n";} demo& operator=(const demo& rhs) {data = rhs.data; std::cout<<"assignment\n"; return *this;} demo& operator=(const r_ref<demo>& rhs) {data.swap(rhs.ref.data); std::cout<<"move assignment\n"; return *this;} ~demo() {std::cout<<"destruct\n";} void prove() const {std::cout<<(void*)data.c_str()<<'\n';} }; r_val<demo> function(const r_ref<demo>& rhs) { demo obj(rhs); obj.prove(); return move(obj); } //test suite int main() { std::cout << "want default: "; demo a; std::cout << "want VAR1: "; a.prove(); std::cout << "want move construct, VAR1, move construct, destruct, move construct, destruct: "; //demo b = function(a); //doesn't compile, lvalue isn't rvalue demo b = function(move(a)); std::cout << "want VAR2: "; a.prove(); std::cout << "want VAR1: "; b.prove(); std::cout << "want assignment: "; a = b; std::cout << "want VAR3: "; a.prove(); std::cout << "want VAR1: "; b.prove(); std::cout << "want move assign: "; a = move(b); std::cout << "want VAR1: "; a.prove(); std::cout << "want VAR3: "; b.prove(); std::cout << "want 2x destruct: "; } |
Ly9ydmFsdWUgY2xhc3NlcyBhbmQgbW92ZSBmdW5jdGlvbgp0ZW1wbGF0ZSA8Y2xhc3MgVD4Kc3RydWN0IHJfcmVmIHsKICAgIG11dGFibGUgVCYgcmVmOwogICAgcl9yZWYoVCYgcmhzKSA6cmVmKHJocykge30KICAgIHJfcmVmKGNvbnN0IHJfcmVmJiByaHMpIDpyZWYocmhzLnJlZikge30KfTsKdGVtcGxhdGUgPGNsYXNzIFQ+CnN0cnVjdCByX3ZhbCA6IHJfcmVmPFQ+IHsKICAgIG11dGFibGUgVCB2YWw7CiAgICByX3ZhbChUJiByaHMpIDpyX3JlZjxUPih2YWwpLCB2YWwocmhzKSB7fQogICAgcl92YWwoY29uc3Qgcl9yZWY8VD4mIHJocykgOnJfcmVmPFQ+KHZhbCksIHZhbChyaHMpIHt9Cn07CnRlbXBsYXRlIDxjbGFzcyBUPgpyX3JlZjxUPiBtb3ZlKFQmIHJocykge3JldHVybiByX3JlZjxUPihyaHMpO30KCgoKCgovL2RlbW8gY2xhc3NlcwojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxzdHJpbmc+CmNsYXNzIGRlbW8gewpwdWJsaWM6CiAgICBzdGQ6OnN0cmluZyBkYXRhOwogICAgZGVtbygpIDogZGF0YSgiTE9ORyBTVFJJTkcgU08gTk8gQ0hFQVRTIikge3N0ZDo6Y291dDw8ImRlZmF1bHQgY29uc3RydWN0XG4iO30KICAgIGRlbW8oY29uc3QgZGVtbyYgcmhzKSA6IGRhdGEocmhzLmRhdGEpIHtzdGQ6OmNvdXQ8PCJjb3B5IGNvbnN0cnVjdFxuIjt9CiAgICBkZW1vKGNvbnN0IHJfcmVmPGRlbW8+JiByaHMpIDogZGF0YSgpIHtkYXRhLnN3YXAocmhzLnJlZi5kYXRhKTsgc3RkOjpjb3V0PDwibW92ZSBjb25zdHJ1Y3RcbiI7fQogICAgZGVtbyYgb3BlcmF0b3I9KGNvbnN0IGRlbW8mIHJocykge2RhdGEgPSByaHMuZGF0YTsgc3RkOjpjb3V0PDwiYXNzaWdubWVudFxuIjsgcmV0dXJuICp0aGlzO30KICAgIGRlbW8mIG9wZXJhdG9yPShjb25zdCByX3JlZjxkZW1vPiYgcmhzKSB7ZGF0YS5zd2FwKHJocy5yZWYuZGF0YSk7IHN0ZDo6Y291dDw8Im1vdmUgYXNzaWdubWVudFxuIjsgcmV0dXJuICp0aGlzO30KICAgIH5kZW1vKCkge3N0ZDo6Y291dDw8ImRlc3RydWN0XG4iO30KICAgIHZvaWQgcHJvdmUoKSBjb25zdCB7c3RkOjpjb3V0PDwodm9pZCopZGF0YS5jX3N0cigpPDwnXG4nO30KfTsKCnJfdmFsPGRlbW8+IGZ1bmN0aW9uKGNvbnN0IHJfcmVmPGRlbW8+JiByaHMpIHsKICAgIGRlbW8gb2JqKHJocyk7CiAgICBvYmoucHJvdmUoKTsKICAgIHJldHVybiBtb3ZlKG9iaik7Cn0KCgoKLy90ZXN0IHN1aXRlCmludCBtYWluKCkgewogICBzdGQ6OmNvdXQgPDwgIndhbnQgZGVmYXVsdDogIjsgICBkZW1vIGE7CiAgIHN0ZDo6Y291dCA8PCAid2FudCBWQVIxOiAiOyAgIGEucHJvdmUoKTsKICAgc3RkOjpjb3V0IDw8ICJ3YW50IG1vdmUgY29uc3RydWN0LCBWQVIxLCBtb3ZlIGNvbnN0cnVjdCwgZGVzdHJ1Y3QsIG1vdmUgY29uc3RydWN0LCBkZXN0cnVjdDogIjsKICAgLy9kZW1vIGIgPSBmdW5jdGlvbihhKTsgLy9kb2Vzbid0IGNvbXBpbGUsIGx2YWx1ZSBpc24ndCBydmFsdWUKICAgZGVtbyBiID0gZnVuY3Rpb24obW92ZShhKSk7CiAgIHN0ZDo6Y291dCA8PCAid2FudCBWQVIyOiAiOyAgIGEucHJvdmUoKTsKICAgc3RkOjpjb3V0IDw8ICJ3YW50IFZBUjE6ICI7ICAgIGIucHJvdmUoKTsKICAgc3RkOjpjb3V0IDw8ICJ3YW50IGFzc2lnbm1lbnQ6ICI7ICAgYSA9IGI7CiAgIHN0ZDo6Y291dCA8PCAid2FudCBWQVIzOiAiOyAgIGEucHJvdmUoKTsKICAgc3RkOjpjb3V0IDw8ICJ3YW50IFZBUjE6ICI7ICAgYi5wcm92ZSgpOwogICBzdGQ6OmNvdXQgPDwgIndhbnQgbW92ZSBhc3NpZ246ICI7ICAgYSA9IG1vdmUoYik7CiAgIHN0ZDo6Y291dCA8PCAid2FudCBWQVIxOiAiOyAgIGEucHJvdmUoKTsKICAgc3RkOjpjb3V0IDw8ICJ3YW50IFZBUjM6ICI7ICAgYi5wcm92ZSgpOwoKICAgc3RkOjpjb3V0IDw8ICJ3YW50IDJ4IGRlc3RydWN0OiAiOwp9CiAgICA=
-
upload with new input
-
result: Success time: 0.01s memory: 2816 kB returned value: 0
want default: default construct want VAR1: 0x8da6014 want move construct, VAR1, move construct, destruct, move construct, destruct: move construct 0x8da6014 move construct destruct move construct destruct want VAR2: 0x804b0dc want VAR1: 0x8da6014 want assignment: assignment want VAR3: 0x8da6014 want VAR1: 0x8da6014 want move assign: move assignment want VAR1: 0x8da6014 want VAR3: 0x8da6014 want 2x destruct: destruct destruct


