这段代码合法吗? (C ++ 0x移动语义)

时间:2011-07-20 15:12:33

标签: c++ c++11 perfect-forwarding

我很好奇这段代码在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;
}

3 个答案:

答案 0 :(得分:8)

不,它返回对本地对象的引用,就像使用左值引用一样。

只需按值返回它,让x的假定移动构造函数选择rvalue。按值返回时,返回的对象是右值。

如果运气好的话,NRVO优化将会启动(就像之前一样)并且无论如何都要避免复制。

答案 1 :(得分:3)

您正在返回move_it的悬空右值引用,当您在main中访问它时会调用未定义的行为。

如果要移动对象,请将返回类型更改为x并删除移动:

x move_it()
{
    x r;
    return r;
}

(从函数返回时,自动变量被隐式视为rvalues。)

答案 2 :(得分:1)

作为普通用户,任何没有实现模板库的人,你应该做的r值引用的唯一用途就是实现移动构造函数和移动赋值。

观看此视频http://channel9.msdn.com/Shows/Going+Deep/C9-Lectures-Stephan-T-Lavavej-Standard-Template-Library-STL-9-of-n