移动语义和 return 值

Move semantics and return values

是否需要以下函数末尾的 std::move(以避免复制向量)?

std::pair<vector<int>, vector<int>> f()
{
    vector<int> a, b;
    ...
    return std::make_pair(std::move(a), std::move(b));
}

或者即使 std::move 被省略,编译器也会移动向量吗?

std::move是必需的。

如果您的建议被允许,以下代码将(令人惊讶地)被破坏,因为 std::make_pair 的两个参数都将是 moved-from:

std::vector<int> a;
// populate a
return std::make_pair(a, a);