我试图理解Rvalue和Lvalue引用变量的基本概念,以及它们如何作为as变量的函数参数相互转换(如果可能),以及如何理解它们所涉及的内存操作-因此我创建了一个包含所需的ctor和Dtor的类,以理解临时obejct的创建/操作过程中的破坏:
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());
}