首页 > 解决方案 > 右值参数真的是函数范围内的左值参数吗?

问题描述

我在实现list类的代码中找到了以下代码段

    void push_front( const T & x ) { insert( begin( ), x ); }

    void push_front( T && x ) { insert( begin( ), std::move( x ) );}

现在我知道,如果我有一个将参数作为 的函数r-value,则该参数将l-value在函数的范围内(不是吗?)。

所以我可以用

void push_front( const T & x ) { insert( begin( ), x ); }

void push_front( T && x ) { push_front( x );}

第一个问题:我说的对吗?

第二个:考虑到r-value第一个片段中的l-value参数是第二个函数内部的参数,将std::move( x )cast xfrom l-valuetor-value和函数push_front()调用函数的r-value版本insert()还是什么?

编辑::

这是如何insert()实现的

    iterator insert( iterator itr, const T & x )
    {
        Node *p = itr.current;
        theSize++;
        return { p->prev = p->prev->next = new Node{ x, p->prev, p } };
    }


    iterator insert( iterator itr, T && x )
    {
        Node *p = itr.current;
        theSize++;
        return { p->prev = p->prev->next = new Node{ std::move( x ), p->prev, p } };
    }

的定义Node

struct Node
    {
        private:
        T data;
        Node *prev;
        Node *next;

        Node( const T & d = T{ }, Node * p = nullptr,
        Node * n = nullptr )//It's possible because of const
        :data{ d }, prev{ p }, next{ n } { }

        Node( T && d, Node * p = nullptr, Node * n = nullptr )
        : data{ std::move( d ) }, prev{ p }, next{ n } { }
    };

标签: c++move-semanticslis

解决方案


我有一个函数将参数作为 r 值,该参数将是函数范围内的 l 值

是的。一般来说,所有右值引用变量都是左值、函数参数或不是。

所以我可以用...替换以前的片段

是的,但随后push_front(T &&x)将复制x而不是移动它。

std::move( x )x 从左值转换为右值,并且函数push_front()调用函数的右值版本insert()

是的。


推荐阅读