Я пытаюсь понять основные понятия c ссылочной переменной Rvalue и Lvalue, а также то, как их можно преобразовать друг в друга (если это возможно) в качестве параметра функции в качестве переменных и понять операции с памятью, которые в них задействованы - следовательно, я создал класс с необходимыми CTors и Dtor для понимания создания / уничтожения временного объекта во время операции:
class A
{
public:
A() {std::cout << "CTor Called" << std::endl;}
A(const A& a) {std::cout << "Copy CTor Called" << std::endl;}
A(A&& a) {std::cout << "MOve CTor Called" << std::endl; }
void operator =(const A& a){std::cout << "operator= Called" << std::endl;}
~A() {std::cout << "DTor Called" << std::endl;}
void Show(){std::cout << "Show Called" << std::endl;}
};
Сначала я могу создать ссылочные переменные значения R & L:
A a;
A& a1 = a;
const A& a2 = A(); // Lvalue using Rvalue
//But I am unable to create R refererence variable using an L value variable
A&& ra = a; // Does not work
A&& ra = A(); // works
Таким образом, справочные переменные значения R могут создаваться только значениями R в отличие от значений L, которые могут быть получены с использованием значения R
Теперь я записал шаблоны ниже:
template <class T> void fooNoRef(T tmp){tmp.Show();}
template <class T> void fooLRef(T& tmp){tmp.Show();}
template <class T> void fooRRef(T&& tmp){tmp.Show();}
Но я не могу вызвать fooRRef
шаблон функции, используя ссылочную переменную значения R:
int main()
{
A a;
A& a1 = a;
const A& a2 = A();
A&& ra = A();
std::cout << "Calling fooNoRef Template Function" << std::endl;
fooNoRef<A>(a);
std::cout << "Calling fooLRef Template Function" << std::endl;
fooLRef<A>(a);
std::cout << "Calling fooRRef Template Function With Lvalue" << std::endl;
fooRRef<A>(ra); // Does not works??
fooRRef<A>(A());
}
Так, каково понятие ссылочной переменной R и L и как их использовать?