将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()
中的示例部分。