#include <stdio.h>
#include <stdlib.h>
#include <iostream>
void ref(int& v){
printf("ref:v=%d\r\n",v);
}
void ref2(int&& v){
printf("ref2:v=%d\r\n",v);
}
void ref3(int&& v){
printf("ref3:v=%d\r\n",v);
}
int getValue(){
return 123;
}
template<typename T>
void ref3move(T v){
ref3(std::move(v));
}
int main() {
int value=123;
ref(value);
//ref(123); //error: cannot bind non-const lvalue reference of type 'int&' to an rvalue of type 'int'
//ref(getValue()); //error: cannot bind non-const lvalue reference of type 'int&' to an rvalue of type 'int'
//ref2(value); //error: cannot bind rvalue reference of type 'int&&' to lvalue of type 'int'
ref2(123);
ref2(getValue());
ref2(std::move(value));
ref3move(123);
ref3move(value);
ref3move(getValue());
}