某日二师兄参加XXX科技公司的C++工程师开发岗位第16面:
面试官:什么是左值,什么是右值?
二师兄:简单来说,左值就是可以使用
&符号取地址的值,而右值一般不可以使用&符号取地址。
int a = 42; //a是左值,可以&a
int* p = &a;
int* p = &42; //42是右值,无法取地址
二师兄:一般左值存在内存中,而右值存在寄存器中。
int a = 42, b = 1024;
decltype(a+b); //类型为右值,a+b返回的值存在寄存器中
decltype(a+=b); //类型为左值,a+=b返回的值存储在内存中
二师兄:严格意义上分,右值分为纯右值(
pvalue)和将亡值(xvalue)。C++中,除了右值剩余的就是左值。
42; //纯右值
int a = 1024;
std::move(a); //将亡值
面试官:C++98/03中已经有了左值,为什么还要增加右值的概念?
二师兄:主要是为了效率。特别是
STL中的容器,当需要把容器当作参数传入函数时:
void function(std::vector<int> vi2)
{
vi2.push_back(6)

面试中,二师兄解释了左值和右值的概念,以及C++为何引入右值引用以提高效率,特别是在STL容器的传递中。他还讨论了移动构造函数的noexcept关键字,强调其不应省略以避免效率损失,并提及std::move的作用。此外,提到了万能引用的概念及其在模板编程中的应用,以及完美转发在保持原始参数特性上的关键作用。
最低0.47元/天 解锁文章
2482

被折叠的 条评论
为什么被折叠?



