#include <iostream>
class foo {
public:
foo() { std::cout << "ctor" << std::endl; }
foo(const foo & x) { std::cout << "copy" << std::endl; }
foo(foo && x) { std::cout << "move" << std::endl; }
};
class move {
foo a;
};
class does_not_move {
foo a;
public:
does_not_move() {}
does_not_move(const does_not_move &m) : a(m.a) {}
};
int main() {
std::cout << "--- move ---" << std::endl;
move m;
move m2(std::move(m));
std::cout << "--- doesn't move ---" << std::endl;
does_not_move dm;
does_not_move dm2(std::move(dm));
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3MgZm9vIHsKcHVibGljOgogICAgZm9vKCkgeyBzdGQ6OmNvdXQgPDwgImN0b3IiIDw8IHN0ZDo6ZW5kbDsgfQogICAgZm9vKGNvbnN0IGZvbyAmIHgpIHsgc3RkOjpjb3V0IDw8ICJjb3B5IiA8PCBzdGQ6OmVuZGw7IH0KICAgIGZvbyhmb28gJiYgeCkgeyBzdGQ6OmNvdXQgPDwgIm1vdmUiIDw8IHN0ZDo6ZW5kbDsgfQp9OwoKY2xhc3MgbW92ZSB7Cglmb28gYTsKfTsKCmNsYXNzIGRvZXNfbm90X21vdmUgewoJZm9vIGE7CnB1YmxpYzoKCWRvZXNfbm90X21vdmUoKSB7fQoJZG9lc19ub3RfbW92ZShjb25zdCBkb2VzX25vdF9tb3ZlICZtKSA6IGEobS5hKSB7fQp9OwoKaW50IG1haW4oKSB7CglzdGQ6OmNvdXQgPDwgIi0tLSBtb3ZlIC0tLSIgPDwgc3RkOjplbmRsOwogICAgbW92ZSBtOwogICAgbW92ZSBtMihzdGQ6Om1vdmUobSkpOwoJc3RkOjpjb3V0IDw8ICItLS0gZG9lc24ndCBtb3ZlIC0tLSIgPDwgc3RkOjplbmRsOwogICAgZG9lc19ub3RfbW92ZSBkbTsKICAgIGRvZXNfbm90X21vdmUgZG0yKHN0ZDo6bW92ZShkbSkpOwogICAgcmV0dXJuIDA7Cn0=