使用带有右值引用的push_back?

时间:2014-01-17 15:18:30

标签: c++ c++11

将push_back与rvalue引用一起使用?

我有以下代码:

csvData.push_back(CsvDataSet(csvBlock));

我应该这样做:

csvData.push_back(std::move(CsvDataSet(csvBlock)));

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

2 个答案:

答案 0 :(得分:6)

假设CsvDataSet是一个班级:不,你不应该。 CsvDataSet(csvBlock)已经是 rvalue 。更准确地说,它是 prvalue

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

答案 1 :(得分:4)

我认为你应该使用emplace_back()

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

不确定,但我认为这相当于使用push_back(std::move(T())),但也许downvoter纠正了我。 澄清结果应该相同,但是emplace会将参数转发给构造函数并构造元素,而push_back调用move构造函数,或者正常的,然后{移动物体。

编辑:如果downvoter同意下面@ user3111311提供的推理,我建议您阅读emplace_back()中的示例部分。