【发布时间】:2016-09-07 12:38:08
【问题描述】:
在创建对象时使用 r 值引用有什么好处,否则它会在普通的局部变量中?
Foo&& cn = Foo();
cn.m_flag = 1;
bar.m_foo = std::move(cn);
//cn is not used again
Foo cn;
cn.m_flag = 1;
bar.m_foo = std::move(cn); //Is it ok to move a non rvalue reference?
//cn is not used again
在第一个代码sn-p中,显然不会有任何副本,但我猜第二个代码编译会优化副本?
同样在第一个sn-p中,对象实际存储在内存中的什么位置(在第二个中它存储在封闭函数的堆栈帧中)?
【问题讨论】:
-
你的第一部分甚至不应该编译。第二部分完全符合您的要求。 std::move 使 cn 成为右值,然后将其移动到 m_foo (假设未删除移动运算符等)。
-
@Hayt,为什么不能编译?据我了解,将临时值分配给 r 值 ref 可以延长临时值的寿命(如果它是普通引用,那么是的,它不会编译)
-
嗯,好的。只是从未见过有人以这种方式编码(这并不是真正必要的)。但是仍然移动主要是为了将非右值对象变成右值。
标签: c++ rvalue-reference