【发布时间】:2021-12-23 20:04:20
【问题描述】:
我想记得有人告诉我这两种方法
foo(std::vector<int>&& v) {
member = std::move(v);
}
bar(std::vector<int> v) {
member = std::move(v);
}
如果调用站点发生移动,两者都不会调用副本
foo(std::move(v1));
bar(std::move(v2));
因为编译器将优化调用并将bar 的情况视为通过右值引用获取参数,因此应该支持bar 语法,因为它不那么复杂并且也可以用左值调用(在这种情况下,当然会制作副本)。
这是真的吗?只要有人用右值调用它,就可以依赖barcase 不创建副本吗?
【问题讨论】:
-
两者都可以。人们经常为第二种情况争论不休,但这可能会在不需要时涉及额外的动作
-
这个问题的一个相关说明是
std::vector有一个移动构造函数,它是高效的。其他类型可能不会。 -
@DrewDormann 哦,原来如此。 value 参数是通过其 move 构造函数构造的,这就是为什么只要使用右值调用函数就不会创建副本?
-
@matthias_buehlmann 是的!这使得
bar成为左值和右值的不错选择。您的foo仅接受 r 值。 -
如果打算始终移出参数,则第一个版本更安全,因为它不会绑定到可变的左值引用并进行复制。
标签: c++ move-semantics rvalue