我在一些代码中遇到了这个问题(为了清晰起见,细节已被省略):
std::vector<std::vector<int>> foo;
{
std::vector<int> bar = {42};
foo.push_back(std::move(bar)); // Hmmm...
} // Indicate `bar` is no longer needed.
std::move
对我来说似乎是不必要的,但它真的吗?与仅使用 foo.push_back(bar);
相比,行为是否有任何不同?如果元素不是 int
而是一个类,例如在我的实际代码中一样是 pcl::PointXYZ
,会发生什么情况?
更新:我已经修改了代码,更明确地表明在使用 std::move
后不再使用 bar
,因此没有非法访问等风险。
std::move
使其明确优化必须发生吗? - Ken Y-Nstd::move
,“优化”将不会发生)。您甚至可以使用emplace
。foo.emplace(std::move(bar));
。如果代码如此简单(在push_back
之前没有使用var
),则可以使用foo.emplace(std :: vector {42})
,甚至可以使用foo.emplace({42})
。 - alfCvar
可能会被推迟到emplace
之后,因为emplace
旨在返回迭代器? - Swift - Friday Pie