c++ - 右值参数真的是函数范围内的左值参数吗?
问题描述
我在实现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 x
from l-value
tor-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 } { }
};
解决方案
我有一个函数将参数作为 r 值,该参数将是函数范围内的 l 值
是的。一般来说,所有右值引用变量都是左值、函数参数或不是。
所以我可以用...替换以前的片段
是的,但随后push_front(T &&x)
将复制x
而不是移动它。
将
std::move( x )
x 从左值转换为右值,并且函数push_front()
调用函数的右值版本insert()
是的。
推荐阅读
- angular - 使用 cdk/ComponentPortal 动态添加组件
- excel - 运行时错误“91”:对象变量或未在 h = ie.hwnd 行上设置块变量
- objective-c - Xamarin 方法调配不起作用。为什么不?
- android - Koin 中的 DSL 有什么用?
- python - (Python)我需要删除列表中的重复元素(使用删除功能;避免类型转换)。试图确定为什么我的解决方案不正确
- c# - 实体框架错误删除具有外键的对象
- angular - 即使在 Angular 8 中的 ngAfterViewInit 上也未定义 ViewChild elementRef
- java - android Studio 的 DownloadManger 类中“外部”的确切参考是什么?
- javascript - ASP / HTML / Javascript 无法正常工作
- mongodb - MongoDB 使用匹配而不是聚合