代码之家  ›  专栏  ›  技术社区  ›  Programmer

L和R参考变量

  •  1
  • Programmer  · 技术社区  · 6 年前

    我试图理解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());
    }
    

    1 回复  |  直到 6 年前
        1
  •  1
  •   songyuanyao    6 年前

    但我不能打电话 fooRRef 使用R值引用变量的函数模板:

    类型 value categories . 作为命名变量, ra 是左值,则无法绑定到右值引用。

    (强调我的)

    变量名等)的特征是 两个独立属性:a 以及 .

    • 变量、函数的名称 , a template parameter object (since C++20) std::cin std::endl . 即使变量的类型是rvalue reference ;

    另一方面,它可以绑定到左值引用,例如。

    fooLRef<A>(ra); // works
    

    std::move ,例如。

    fooRRef<A>(std::move(ra)); // works
    

    转换为要绑定到接受 rvalue引用参数,这就是为什么move构造函数和move 标准::移动 :