c++ 右值引用的理解

天王盖地虎626 发布于 08/29 13:26
阅读 414
收藏 0

【深度】AI、5G时代下,算力网络与内生安全最全解析!>>>

c++对于刚才说的这一点也有一些安全措施,比如下面的代码中,会直接调用BaseClass的常规拷贝构造函数:

void func(BaseClass&& x)

{
BaseClass y = x; 

}

虽然形参是右值引用类型,但是c++认为,x在func的整个作用域内都是可见的,所以会把x当做左值来使用。

不理解这里被当做左值使用,这里的可见是什么意思?

如果上面的,被当做左值引用,那下面的到底是当做左值呢,还是右值?

  // move赋值函数
 CMyString &operator =(CMyString &&s)
 {
  cout << "CMyString &operator =(CMyString &&s)" << endl;
  if (this != &s)
  {
   delete [] m_pData;
   m_pData = s.m_pData;
   s.m_pData = NULL;
  }
  return *this;
 }

 

加载中
0
l
ls-l-a

用class包装过再理解可能会有点难度,用普通数值来理解可能会简单点。

int return_v(int &value)
{
    return value * 3;
}


int return_v(int &&value)
{
    return value * 2;
}

int main()
{
    int number = 10;
    return_v(number); // 调用 return_v(int &value)
    return_v(10);     // 调用 return_v(int &&value)

    // 你可以自己试下编译这一段,看看输出的是什么,这样就容易理解了。最好自行在两个return_v的reeturn位置打断点跟踪
    return_v(return_v(number));
}

简单来说,&&“捕捉”到的数值,在“捕捉”前是右值,“捕捉”后就“变成”了左值。

换成了class也是一样的。

返回顶部
顶部