将push_back与右值引用一起使用

Using push_back with rvalue references?

本文关键字:引用 一起 push back      更新时间:2023-10-16

将push_back与右值引用一起使用?

我有以下代码:

csvData.push_back(CsvDataSet(csvBlock));

我应该这样做吗:

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

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

假设CsvDataSet是一个类:不,你不应该。 CsvDataSet(csvBlock)已经是一个右值。更准确地说,它是一个原则

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

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

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

不确定,但我认为它等同于使用push_back(std::move(T())),但也许反对者纠正我,请。澄清结果应该是相同的,但emplace将参数转发给构造函数并就地构造元素,而push_back调用构造函数或普通构造函数move然后移动对象。

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