#include <iostream>
//Returns r-value
int Add(int x, int y) {
return x + y;
}
//Return l-value
int & Transform(int &x) {
x *= x;
return x;
}
void Print(int &x) {
std::cout << "Print(int&) L value ref" << std::endl;
}
void Print(const int &x) {
std::cout << "Print(const int&) const l value ref" << std::endl;
}
void Print(int &&x) {
std::cout << "Print(int &&) r value ref" << std::endl;
}
int main() {
//x is lvalue
int x = 10;
//ref is l-value reference
int &ref = x ;
//Transform returns an l-value
int &ref2 = Transform(x) ;
//Binds to function that accepts l-value reference
Print(x);
Print(ref);
Print(ref2);
//rv is r-value reference
int &&rv = 8 ;
//Add returns a temporary (r-value)
int &&rv2 = Add(3,5) ;
//Binds to function that accepts a temporary, i.e. r-value reference
Print(3);
Print(std::move(rv));
Print(std::move(rv2));
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKLy9SZXR1cm5zIHItdmFsdWUKaW50IEFkZChpbnQgeCwgaW50IHkpIHsKICAgIHJldHVybiB4ICsgeTsKfQovL1JldHVybiBsLXZhbHVlCmludCAmIFRyYW5zZm9ybShpbnQgJngpIHsKICAgIHggKj0geDsKICAgIHJldHVybiB4Owp9Cgp2b2lkIFByaW50KGludCAmeCkgewogICAgc3RkOjpjb3V0IDw8ICJQcmludChpbnQmKSBMIHZhbHVlIHJlZiIgPDwgc3RkOjplbmRsOyAKfQp2b2lkIFByaW50KGNvbnN0IGludCAmeCkgewogICAgc3RkOjpjb3V0IDw8ICJQcmludChjb25zdCBpbnQmKSBjb25zdCBsIHZhbHVlIHJlZiIgPDwgc3RkOjplbmRsOwoKfQp2b2lkIFByaW50KGludCAmJngpIHsKICAgIHN0ZDo6Y291dCA8PCAiUHJpbnQoaW50ICYmKSByIHZhbHVlIHJlZiIgPDwgc3RkOjplbmRsOwp9CmludCBtYWluKCkgewogICAgLy94IGlzIGx2YWx1ZQogICAgaW50IHggPSAxMDsKICAgIAogICAgLy9yZWYgaXMgbC12YWx1ZSByZWZlcmVuY2UKICAgIGludCAmcmVmID0geCA7CiAgICAvL1RyYW5zZm9ybSByZXR1cm5zIGFuIGwtdmFsdWUKICAgIGludCAmcmVmMiA9IFRyYW5zZm9ybSh4KSA7CiAgICAvL0JpbmRzIHRvIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBsLXZhbHVlIHJlZmVyZW5jZQogICAgUHJpbnQoeCk7CgogICAgUHJpbnQocmVmKTsKICAgIFByaW50KHJlZjIpOwoKICAgIC8vcnYgaXMgci12YWx1ZSByZWZlcmVuY2UKICAgIGludCAmJnJ2ID0gOCA7CiAgICAKICAgIC8vQWRkIHJldHVybnMgYSB0ZW1wb3JhcnkgKHItdmFsdWUpCiAgICBpbnQgJiZydjIgPSBBZGQoMyw1KSA7CiAgICAvL0JpbmRzIHRvIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBhIHRlbXBvcmFyeSwgaS5lLiByLXZhbHVlIHJlZmVyZW5jZQogICAgUHJpbnQoMyk7CiAgICBQcmludChzdGQ6Om1vdmUocnYpKTsKICAgIFByaW50KHN0ZDo6bW92ZShydjIpKTsKICAgIHJldHVybiAwOwp9