emplace_back传入std::move和非std::move值区别

273 阅读1分钟

emplace_back 函数可以接受参数值,并在容器末尾直接构造新的元素。当传递值给 emplace_back 函数时,使用或不使用 std::move 会导致不同的行为:

  1. 不使用 std::move
    如果不使用 std::move,传递的参数值会被视为左值。在这种情况下,emplace_back 将尝试使用拷贝构造函数来构造新的元素。这意味着会创建一个新的对象并拷贝传递的值,而不会移动资源的所有权。

    例如:objects.emplace_back(MyObject(10));

    在这个例子中,传递给 emplace_back 的参数值 MyObject(10) 是一个右值。但由于没有使用 std::move,它被视为左值。因此,emplace_back 会调用 MyObject 类的拷贝构造函数来创建新的元素。

  2. 使用 std::move
    通过使用 std::move,我们将参数值显式地转换为右值引用,以实现移动语义。这意味着 emplace_back 不会创建一个新的对象并拷贝传递的值,而是将传递的值视为可移动的资源并转移所有权。

    例如:objects.emplace_back(std::move(MyObject(10)));

    在这个例子中,由于使用了 std::move,传递给 emplace_back 的参数值 MyObject(10) 被视为右值引用。因此,emplace_back 会调用 MyObject 类的移动构造函数来创建新的元素,并将资源的所有权从临时对象转移到容器内的对象。

总结:

  • 不使用 std::moveemplace_back 将会将参数视为左值,并尝试进行拷贝构造。
  • 使用 std::moveemplace_back 将会将参数视为右值引用,并调用移动构造函数,实现移动语义,将资源的所有权转移给容器内的对象。