将push_back与rvalue引用一起使用?
我有以下代码:
csvData.push_back(CsvDataSet(csvBlock));
我应该这样做:
csvData.push_back(std::move(CsvDataSet(csvBlock)));
这样我保存了一个复制操作。
答案 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()
中的示例部分。