Я нашел следующий фрагмент в коде, реализующем класс 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 } { }
};