Является ли параметр r-value действительно параметром l-value внутри области действия функции? - PullRequest
2 голосов
/ 28 января 2020

Я нашел следующий фрагмент в коде, реализующем класс 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 внутри второй функции, Will std::move( x ) приведёт x с l-value до r-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 } { }
    };

1 Ответ

1 голос
/ 28 января 2020

У меня есть функция, принимающая параметр в качестве значения r, этот параметр будет значением l в области действия функции

Да. В общем, все ссылочные переменные rvalue являются lvalues, параметрами функции или нет.

Так что я могу заменить предыдущий фрагмент на ...

Да, но тогда push_front(T &&x) скопирует x вместо перемещения.

будет std::move( x ) приводить x к значению l к значению r, а функция push_front() вызывает версию функции с r-значением insert()

Да.

...