美文网首页
C++11之右值引用&移动语义

C++11之右值引用&移动语义

作者: 上官宏竹 | 来源:发表于2021-07-22 16:27 被阅读0次

什么是左值、什么是右值

简单来说左值可以取地址、位于等号左边;而右值没法取地址,位于等号右边。

左值引用、右值引用

左值引用:&能指向左值,不能指向右值。
右值引用:&&能指向右值,不能指向左值。

int a = 5;
int &ref_a = a; // 左值引用指向左值,编译通过
int &ref_a = 5; // 左值引用指向了右值,会编译失败
const int &ref_a = 5;  // 编译通过,const左值引用可以指向右值

注意:
const左值引用不会修改指向值,因此可以指向右值,这也是为什么要使用const &作为函数参数的原因之一,如std::vector的push_back:void push_back (const value_type& val);。如果没有const,vec.push_back(5)这样的代码就无法编译通过了。

右值引用指向左值

使用std::move,可以将右值应用指向左值。std::move其实就是一个强制转换如:static_cast<T&&>(lvalue)

int a = 5; // a是个左值
int &&ref_a_right = std::move(a);

右值引用、左值引用本身是左值

int &&ref_a_right = std::move(a);,而ref_a_right 本身是一个左值。

总结

  1. 从性能上讲,左右值引用没有区别,传参使用左右值引用都可以避免拷贝。
  2. 右值引用可以直接指向右值,也可以通过std::move指向左值;而左值引用只能指向左值(const左值引用也能指向右值)。
  3. 作为函数形参时,右值引用更灵活。虽然const左值引用也可以做到左右值都接受,但它无法修改,有一定局限性。
void f(const int& n) {
    n += 1; // 编译失败,const左值引用不能修改指向变量
}

void f2(int && n) {
    n += 1; // ok
}

int main() {
    f(5);
    f2(5);
}

移动语义

移动构造函数、移动赋值运算符

参考:一文读懂C++右值引用和std::move

相关文章

  • C++11之右值引用&移动语义

    什么是左值、什么是右值 简单来说左值可以取地址、位于等号左边;而右值没法取地址,位于等号右边。 左值引用、右值引用...

  • 带你一起探索 c++11 中右值引用、移动构造、&&、move、

    本文将介绍带你一步步的了解 c++11 中: 右值、右值引用 移动构造函数 && 解密 move 移动语义 for...

  • C++右值引用

    C++右值引用 右值引用应该是C++11引入的一个非常重要的技术,因为它是移动语义(Move semantics)...

  • [C++11阅读]移动语义和完美转发(下)

    移动语义 右值引用与移动构造函数结合,可以起到无拷贝所有权转移的效果。C++11的标准库中的std::move()...

  • 【备忘】c++之移动语意

    个人认为c++11里最难的是右值引用,因此在此梳理一下 移动语义:利用move函数来标记右值进行移动。对于基本类型...

  • 【C++11】右值引用

    右值引用是C++11中一个非常重要的特性。 右值引用的提出,是为了在语法层面,解决向C++中添加移动语义时难以解决...

  • C++11 移动语义和右值引用

    以下内容引自[wikipedia](https://zh.wikipedia.org/wiki) ### 什么是右...

  • 右值引用的解释【1】

    右值引用是 C++11 引入的特性,用来解决两个问题: 移动语义; 完美转发。 这一系列文章会从这解释这两个问题,...

  • C++11中std::move、std::forward、左右值

    C++11中std::move、std::forward、左右值引用、移动构造函数的测试 关于C++11新特性之s...

  • 18/2

    移动语义与右值引用(只能在右边) 1.移动语义:实际文件还留在原来地方,而只是修改记录,移动语义实际上避免了移动原...

网友评论

      本文标题:C++11之右值引用&移动语义

      本文链接:https://www.haomeiwen.com/subject/snwjmltx.html