#include <iostream>
#include <utility>
#include <typeinfo>
using namespace std;
class Bar {
public :
Bar( ) { value = 5 ; }
Bar( Bar&& other) {
value = std:: move ( other.value ) ;
other.value = int ( ) ;
}
int value;
} ;
void foo( Bar&& bar) {
Bar test1( bar) ; // this doesnt work !!!
Bar test2( std:: move ( bar) ) ; // this does work
Bar test3( ( Bar&& ) bar) ; //and this works too!
// yet this returns true:
bool sameTypes1 = typeid ( bar) == typeid ( Bar&& ) ;
bool sameTypes2 = typeid ( bar) == typeid ( std:: move ( bar) ) ;
std:: cout << sameTypes1 << std:: endl ; // true or 1
std:: cout << sameTypes2 << std:: endl ; // true or 1
}
int main( ) {
Bar bar;
foo( std:: move ( bar) ) ;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dXRpbGl0eT4KI2luY2x1ZGUgPHR5cGVpbmZvPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgQmFyIHsKCXB1YmxpYzoKCQlCYXIoKSB7IHZhbHVlID0gNTsgfQoKCQlCYXIoQmFyJiYgb3RoZXIpIHsKCQkJdmFsdWUgPSBzdGQ6Om1vdmUob3RoZXIudmFsdWUpOwoJCQlvdGhlci52YWx1ZSA9IGludCgpOwoJCX0KCgkJaW50IHZhbHVlOwp9OwoKdm9pZCBmb28oQmFyJiYgYmFyKSB7CglCYXIgdGVzdDEoYmFyKTsgCQkJCS8vIHRoaXMgZG9lc250IHdvcmsgISEhCglCYXIgdGVzdDIoc3RkOjptb3ZlKGJhcikpOyAJCS8vIHRoaXMgZG9lcyB3b3JrCglCYXIgdGVzdDMoKEJhciYmKWJhcik7CQkJLy9hbmQgdGhpcyB3b3JrcyB0b28hCgoJLy8geWV0IHRoaXMgcmV0dXJucyB0cnVlOgoJYm9vbCBzYW1lVHlwZXMxID0gdHlwZWlkKGJhcikgPT0gdHlwZWlkKEJhciYmKTsKCWJvb2wgc2FtZVR5cGVzMiA9IHR5cGVpZChiYXIpID09IHR5cGVpZChzdGQ6Om1vdmUoYmFyKSk7CgoJc3RkOjpjb3V0IDw8IHNhbWVUeXBlczEgPDwgc3RkOjplbmRsOyAvLyB0cnVlIG9yIDEKICAgIHN0ZDo6Y291dCA8PCBzYW1lVHlwZXMyIDw8IHN0ZDo6ZW5kbDsgLy8gdHJ1ZSBvciAxCn0KCmludCBtYWluKCkgewoJQmFyIGJhcjsKCglmb28oc3RkOjptb3ZlKGJhcikpOwoKCXJldHVybiAwOwp9