通过右值引用传递并使用 std::move() 返回
Pass by rvalue reference and return using std::move()?
考虑:
struct Foo {
Foo () { std::cout << "default ctor" << std::endl; }
Foo (const Foo&) { std::cout << "copy ctor" << std::endl; }
Foo& operator= (const Foo&) { std::cout << "copy op" << std::endl; return *this; }
Foo (Foo&&) { std::cout << "move ctor" << std::endl; }
Foo& operator= (Foo&&) { std::cout << "move op" << std::endl; return *this; }
~Foo () { std::cout << "dtor" << std::endl; }
};
Foo process1 (Foo&& foo) {
return foo;
}
Foo process2 (Foo&& foo) {
return std::move (foo);
}
和用法:
Foo foo {};
foo = process1 (std::move (foo));
给出结果:
default ctor
copy ctor
move op
dtor
dtor
和用法:
Foo foo {};
foo = process2 (std::move (foo));
给出结果:
default ctor
move ctor
move op
dtor
dtor
哪一个是首选(进程 1 或进程 2(?
这是否意味着在第一个示例 (process1( 中,如果我通过右值引用将对象传递给返回对象的函数,如果我不使用 std::move()
,就会进行复制?
编译器:GCC 5.2.1
在第一个版本中
Foo process1 (Foo&& foo) {
return foo;
}
您将其作为右值引用传递,但通过"如果它有名称"启发式方法,它被视为函数中的左值,因此是复制 CTOR。
第二个版本使用std::move
"重制"了一个右值(这正是它的意思(。因此,避免了复制 ctor。
期望移动不会比副本更昂贵是相当合理的,因此,鉴于现实生活中的情况归结为这一点,您可能更喜欢第二个版本。
相关文章:
- Usages of std::move
- 在C++中对T*类型执行std::move的意外行为
- 关于std::move的使用,是否有编译警告
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 通过实例理解std::move及其目的
- 返回一个带有 std::move 的对象并链接函数
- 当 std::move 与 C 样式数组或不移动对象时会发生什么
- std::move a const std::vector in a lambda capture
- "std::forward"和"std::move"真的不生成代码吗?
- 如何在没有 std::move 的情况下移动临时对象
- 关于在成员重载中使用 std::move() 的问题
- 显式清除 std::move 之后的源资源
- std::move 如何使原始变量的值无效?
- 复制elision、std::move和链式函数调用
- 如果真的需要std::move,我们应该什么时候声明右值refs
- 使用std::move将std::unique_ptr作为qt信号参数传递
- 无法使用带有 std::move 的自定义删除器插入 std::unique_ptr
- C++:我应该在 return 语句中显式使用 std::move() 来强制移动吗?
- 编译器是否足够聪明,以至于 std::move 变量超出范围?
- std::move() 或其在局部变量上的显式等价物可以允许 elision 吗?