我很好奇这段代码在C ++ 0x中是否合法。具体来说,函数move_it()
中声明的对象是否可以正确移动到main()
中声明的对象?
#include <iostream>
#include <string>
#include <tr1/memory>
using namespace std;
class x
{
public:
x() { cout << "create " << this << endl; }
~x() { cout << "destroy " << this << endl; }
};
x&& move_it()
{
x r;
return move(r);
}
int main()
{
x n = move_it();
return 0;
}
答案 0 :(得分:8)
不,它返回对本地对象的引用,就像使用左值引用一样。
只需按值返回它,让x的假定移动构造函数选择rvalue。按值返回时,返回的对象是右值。
如果运气好的话,NRVO优化将会启动(就像之前一样)并且无论如何都要避免复制。
答案 1 :(得分:3)
您正在返回move_it
的悬空右值引用,当您在main
中访问它时会调用未定义的行为。
如果要移动对象,请将返回类型更改为x
并删除移动:
x move_it()
{
x r;
return r;
}
(从函数返回时,自动变量被隐式视为rvalues。)
答案 2 :(得分:1)
作为普通用户,任何没有实现模板库的人,你应该做的r值引用的唯一用途就是实现移动构造函数和移动赋值。