#include <thread>
#include <iostream>
class cl1;
class cl2;
class cl2 {
public:
int y;
cl2(int y) : y(y) {} //ctor
};
class cl1 {
public:
int x;
cl1(int x) : x(x) {} //ctor
cl1(cl2& ob1) : x(ob1.y * 2) {} //ctor for automatic conversion of cl2& to cl1, x = y*2
};
void do_work_with_cl(cl1 ob) { //This works as usual by actually copying the object through the copy constructor
std::cout << "The x of ob is " << ob.x << std::endl;
}
void do_work_with_cl_rref(cl1&& ob) { //I guess this works because it takes an rvalue and the automatic
//conversion ctor of cl1 does just that
std::cout <<"Inside the function that takes cl1 as rvalue, x of ob is" << ob.x << std::endl;
}
void do_work_with_cl_lref(cl1& ob) { //This doesn't work as ob is non-const lvalue reference
std::cout << "lvalue referenced but the object created through implicit conversion is temporary(i.e rvalue)" << std::endl;
}
int main() {
//Normal non-threaded calls
cl2 ob(100); //create a cl2 object
do_work_with_cl(ob); //This is ok
do_work_with_cl_rref(ob); //This too works
//do_work_with_cl_lref(ob) //This fails, as suspected
std::cout << "Thread part" << std::endl;
//Now calling the functions through a thread
std::thread t1(do_work_with_cl_rref, ob); //Thought this could work here, but doesn't
//The other functions also don't work, but I can understand why.
t1.join();
}
I2luY2x1ZGUgPHRocmVhZD4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3MgY2wxOwpjbGFzcyBjbDI7CgoKY2xhc3MgY2wyIHsKcHVibGljOgogICAgaW50IHk7CiAgICBjbDIoaW50IHkpIDogeSh5KSAgIHt9ICAgICAgICAgIAkJLy9jdG9yCn07CgpjbGFzcyBjbDEgewpwdWJsaWM6CiAgICBpbnQgeDsKICAgIGNsMShpbnQgeCkgOiB4KHgpIHt9ICAgICAgICAgICAgIAkgLy9jdG9yCiAgICBjbDEoY2wyJiBvYjEpIDogeChvYjEueSAqIDIpIHt9ICAgICAgLy9jdG9yIGZvciBhdXRvbWF0aWMgY29udmVyc2lvbiBvZiBjbDImIHRvIGNsMSwgeCA9IHkqMgp9OwoKdm9pZCBkb193b3JrX3dpdGhfY2woY2wxIG9iKSB7CQkJCS8vVGhpcyB3b3JrcyBhcyB1c3VhbCBieSBhY3R1YWxseSBjb3B5aW5nIHRoZSBvYmplY3QgdGhyb3VnaCB0aGUgY29weSBjb25zdHJ1Y3RvcgogICAgc3RkOjpjb3V0IDw8ICJUaGUgeCBvZiBvYiBpcyAiIDw8IG9iLnggPDwgc3RkOjplbmRsOwp9Cgp2b2lkIGRvX3dvcmtfd2l0aF9jbF9ycmVmKGNsMSYmIG9iKSB7CQkvL0kgZ3Vlc3MgdGhpcyB3b3JrcyBiZWNhdXNlIGl0IHRha2VzIGFuIHJ2YWx1ZSBhbmQgdGhlIGF1dG9tYXRpYwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29udmVyc2lvbiBjdG9yIG9mIGNsMSBkb2VzIGp1c3QgdGhhdAogICAgc3RkOjpjb3V0IDw8Ikluc2lkZSB0aGUgZnVuY3Rpb24gdGhhdCB0YWtlcyBjbDEgYXMgcnZhbHVlLCB4IG9mIG9iIGlzIiAgPDwgb2IueCA8PCBzdGQ6OmVuZGw7Cn0KCnZvaWQgZG9fd29ya193aXRoX2NsX2xyZWYoY2wxJiBvYikgewkJLy9UaGlzIGRvZXNuJ3Qgd29yayBhcyBvYiBpcyBub24tY29uc3QgbHZhbHVlIHJlZmVyZW5jZQogICAgc3RkOjpjb3V0IDw8ICJsdmFsdWUgcmVmZXJlbmNlZCBidXQgdGhlIG9iamVjdCBjcmVhdGVkIHRocm91Z2ggaW1wbGljaXQgY29udmVyc2lvbiBpcyB0ZW1wb3JhcnkoaS5lIHJ2YWx1ZSkiIDw8IHN0ZDo6ZW5kbDsKfQoKCmludCBtYWluKCkgewogICAgLy9Ob3JtYWwgbm9uLXRocmVhZGVkIGNhbGxzCiAgICBjbDIgb2IoMTAwKTsJCQkJLy9jcmVhdGUgYSBjbDIgb2JqZWN0CiAgICBkb193b3JrX3dpdGhfY2wob2IpOwkJCS8vVGhpcyBpcyBvawogICAgZG9fd29ya193aXRoX2NsX3JyZWYob2IpOwkvL1RoaXMgdG9vIHdvcmtzCiAgICAvL2RvX3dvcmtfd2l0aF9jbF9scmVmKG9iKQkvL1RoaXMgZmFpbHMsIGFzIHN1c3BlY3RlZAoKICAgIHN0ZDo6Y291dCA8PCAiVGhyZWFkIHBhcnQiIDw8IHN0ZDo6ZW5kbDsKCiAgICAvL05vdyBjYWxsaW5nIHRoZSBmdW5jdGlvbnMgdGhyb3VnaCBhIHRocmVhZAogICAgc3RkOjp0aHJlYWQgdDEoZG9fd29ya193aXRoX2NsX3JyZWYsIG9iKTsJLy9UaG91Z2h0IHRoaXMgY291bGQgd29yayBoZXJlLCBidXQgZG9lc24ndAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RoZSBvdGhlciBmdW5jdGlvbnMgYWxzbyBkb24ndCB3b3JrLCBidXQgSSBjYW4gdW5kZXJzdGFuZCB3aHkuCiAgICB0MS5qb2luKCk7Cn0K