使用带有右值引用的push_back?

use*_*311 1 c++ c++11

使用带有右值引用的push_back?

我有以下代码:

csvData.push_back(CsvDataSet(csvBlock));
Run Code Online (Sandbox Code Playgroud)

我应该这样做:

csvData.push_back(std::move(CsvDataSet(csvBlock)));
Run Code Online (Sandbox Code Playgroud)

这样我保存了一个复制操作.

Sho*_*hoe 6

假设CsvDataSet是一个班级:不,你不应该.CsvDataSet(csvBlock)已经是右值了.更确切地说,它是一个prvalue.

因此,在这两种情况下,void std::vector::push_back( T&& value );都会被调用.


luk*_*k32 5

我认为在你的情况下你应该使用emplace_back().

“将一个新元素附加到容器的末尾。元素是就地构造的,即不执行复制或移动操作。使用提供给函数的完全相同的参数调用元素的构造函数。”

不确定,但我认为它等同于使用push_back(std::move(T())),但也许downvoter 纠正我,拜托。澄清结果应该是一样的,但是emplace将参数转发给构造函数并在原地构造元素,同时push_back调用move构造函数,或者正常的然后移动对象。

编辑:如果downvoter与@ user3111311提出的推理同意下面我敦促阅读示例部分emplace_back()

  • @user3111311 `emplace_back` 在 C++11 中不是多余的。不同的编译器提供了特定形式的 `emplace_back`,这些形式是不兼容和冗余的([see this](http://stackoverflow.com/questions/4303513/push-back-vs-emplace-back))。然而,`emplace_back` 的正确形式直接采用构造函数参数,例如 `csvData.emplace_back(csvBlock)` 是**不**多余的。它将在原地构造对象,而不是像 `void push_back(T&&)` 那样执行移动构造 (5认同)
  • @luk32 是的,`emplace` 可以做到这一点。将 `T const&` 或 `T&&` 传递给 `emplace_back` 与将 `T const&` 或 `T&&` 传递给 `push_back` 具有相同的效果。 (2认同)