#include <iostream>
#include <cassert>
#include <vector>
class MyClass
{
public:
explicit MyClass(
int theA,
int theB
) : myA(theA),
myB(theB)
{
return;
};
MyClass(
MyClass && theOther
) : myA(std::move(theOther.myA)),
myB(std::move(theOther.myB))
{
return;
}
MyClass & operator=(
MyClass && theOther
) {
assert(this != &theOther);
myA = std::move(theOther.myA);
myB = std::move(theOther.myB);
}
private:
// Not default-constructible.
explicit MyClass();
// Enforce move-semantics.
MyClass(const MyClass & theOther);
MyClass & operator=(const MyClass & theOther);
public:
int myA;
int myB;
};
int main(int argc, char * argv[])
{
std::vector<MyClass> v1;
std::vector<MyClass> v2;
v1.push_back(MyClass(1, 2));
v1.push_back(MyClass(2, 3));
v1.push_back(MyClass(2, 4));
// Works.
for(auto i = 0u; i < v1.size(); i++)
if(v1[i].myA == 2)
v2.push_back(std::move(v1[i]));
/*
// Does not work: Calls copy-constructor.
for(auto i = v1.cbegin(); i != v1.cend(); i++)
if(i->myA == 2)
v2.push_back(std::move(*i));
*/
// list1 may not be used any longer!
return 0;
}
CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGNhc3NlcnQ+CiNpbmNsdWRlIDx2ZWN0b3I+CgpjbGFzcyBNeUNsYXNzCnsKcHVibGljOgogICAgZXhwbGljaXQgTXlDbGFzcygKICAgICAgICBpbnQgdGhlQSwgCiAgICAgICAgaW50IHRoZUIKICAgICkgOiBteUEodGhlQSksIAogICAgICAgIG15Qih0aGVCKQogICAgewogICAgICAgIHJldHVybjsKICAgIH07CiAgICAKICAgIE15Q2xhc3MoCiAgICAgICAgTXlDbGFzcyAmJiB0aGVPdGhlcgogICAgKSA6IG15QShzdGQ6Om1vdmUodGhlT3RoZXIubXlBKSksIAogICAgICAgIG15QihzdGQ6Om1vdmUodGhlT3RoZXIubXlCKSkKICAgIHsKICAgICAgICByZXR1cm47CiAgICB9CiAgICAKICAgIE15Q2xhc3MgJiBvcGVyYXRvcj0oCiAgICAgICAgTXlDbGFzcyAmJiB0aGVPdGhlcgogICAgKSB7CiAgICAgICAgYXNzZXJ0KHRoaXMgIT0gJnRoZU90aGVyKTsKICAgICAgICAKICAgICAgICBteUEgPSBzdGQ6Om1vdmUodGhlT3RoZXIubXlBKTsKICAgICAgICBteUIgPSBzdGQ6Om1vdmUodGhlT3RoZXIubXlCKTsKICAgIH0KICAgIApwcml2YXRlOgogICAgLy8gTm90IGRlZmF1bHQtY29uc3RydWN0aWJsZS4gCiAgICBleHBsaWNpdCBNeUNsYXNzKCk7CgogICAgLy8gRW5mb3JjZSBtb3ZlLXNlbWFudGljcy4gCiAgICBNeUNsYXNzKGNvbnN0IE15Q2xhc3MgJiB0aGVPdGhlcik7CiAgICBNeUNsYXNzICYgb3BlcmF0b3I9KGNvbnN0IE15Q2xhc3MgJiB0aGVPdGhlcik7CgpwdWJsaWM6CiAgICBpbnQgbXlBOwogICAgaW50IG15QjsKfTsKCmludCBtYWluKGludCBhcmdjLCBjaGFyICogYXJndltdKQp7CiAgICBzdGQ6OnZlY3RvcjxNeUNsYXNzPiB2MTsKICAgIHN0ZDo6dmVjdG9yPE15Q2xhc3M+IHYyOwogICAgCiAgICB2MS5wdXNoX2JhY2soTXlDbGFzcygxLCAyKSk7CiAgICB2MS5wdXNoX2JhY2soTXlDbGFzcygyLCAzKSk7CiAgICB2MS5wdXNoX2JhY2soTXlDbGFzcygyLCA0KSk7CiAgICAKICAgIC8vIFdvcmtzLgogICAgZm9yKGF1dG8gaSA9IDB1OyBpIDwgdjEuc2l6ZSgpOyBpKyspCiAgICAgICAgaWYodjFbaV0ubXlBID09IDIpCiAgICAgICAgICAgIHYyLnB1c2hfYmFjayhzdGQ6Om1vdmUodjFbaV0pKTsKCi8qCiAgICAvLyBEb2VzIG5vdCB3b3JrOiBDYWxscyBjb3B5LWNvbnN0cnVjdG9yLgogICAgZm9yKGF1dG8gaSA9IHYxLmNiZWdpbigpOyBpICE9IHYxLmNlbmQoKTsgaSsrKQogICAgICAgIGlmKGktPm15QSA9PSAyKQogICAgICAgICAgICB2Mi5wdXNoX2JhY2soc3RkOjptb3ZlKCppKSk7CiovCgogICAgLy8gbGlzdDEgbWF5IG5vdCBiZSB1c2VkIGFueSBsb25nZXIhCiAgICAKICAgIHJldHVybiAwOwp9Cg==