std::move

作者: 陈成_Adam | 来源:发表于2021-02-01 12:26 被阅读0次

班级类包含一个构造方法,传入一个包含许多学生的vector:

class Banji {
public:
  Banji(std::vector<Xuesheng> students) : m_students(students) {}
private:
  std::vector<Xuesheng> m_students;
}

这样有个不好的地方是:每次创建班级对象时都需要将students拷贝给m_students。一个推荐的做法是使用std::move避免拷贝:

class Banji {
public:
  Banji(std::vector<Xuesheng> students) : m_students(std::move(students)) {}
private:
  std::vector<Xuesheng> m_students;
}

但如果students是引用的时候,就需要特别小心了,因为std::move(students)会将students里面的内容清空。下面举例说明:

class Banji0 {
public:
  Banji0(std::vector<Xuesheng> students) : m_students(std::move(students)) {}
private:
  std::vector<Xuesheng> m_students;
}

class Banji1 {
public:
  Banji1(std::vector<Xuesheng> &students) : m_students(std::move(students)) {}
private:
  std::vector<Xuesheng> m_students;
}

int main() {
  auto students = std::vector<Xuesheng>{Xuesheng{0}, Xuesheng{1}};
  auto class0 = Banji0{students};
  std::cout << students.size() << std::endl;

  auto class1 = Banji1{students};
  std::cout << students.size() << std::endl;
  return EXIT_SUCCESS;
}

输出为:

2
0

创建第一个班级对象时,students作为形参会被拷贝一份,所以经过std::move之后,其大小仍然为2;创建第二个班级对象时,传入的是students的引用,所以经过std::move之后,其大小变为0

相关文章

  • Tips of C++11 std::move与完美转发std:

    C++11 std::move 和 std::forward 用法: 当知道类型时, 用 std::move得到一...

  • std::move()

    在隆冬,我终于直到,我身上有一个不可战胜的夏天。 ——阿尔贝·加缪 今天提交了一次代码,短短一百多行里,被各...

  • std::move

    std::move函数可以以非常简单的方式将左值引用转换为右值引用。通过std::move,可以避免不必要的拷贝操...

  • std::move

    首先需要了解一下c++的值的类型 c++ 值的类型 1. lvalue(左值) 2. prvalue(纯右值) 3...

  • std::move

    班级类包含一个构造方法,传入一个包含许多学生的vector: 这样有个不好的地方是:每次创建班级对象时都需要将st...

  • C++ Move Semantics

    Rvalue references and std::move[https://r859981c931022xju...

  • std::forward和std::move源码分析

    原文:https://blog.csdn.net/kupepoem/article/details/1199480...

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

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

  • 智能指针

    std::unique_ptr<> 初始化:直接初始化、右值赋值、std::move作为函数返回值作为函数形参

  • 一文看懂 C++11 的 右值引用、std::move 和 st

    右值引用、std::move 和 std::forward 是 C++11 中的最重大语言新特性之一。就算我们不主...

网友评论

      本文标题:std::move

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