4

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

3 回答 3

8

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

只需按值返回它,让 x 假定的移动构造函数获取右值。按值返回时,返回的对象是一个右值。

如果幸运的话,NRVO 优化将启动(就像以前一样)并且无论如何都会忽略复制。

于 2011-07-20T15:21:31.143 回答
3

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

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

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

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

于 2011-07-20T15:20:44.793 回答
1

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

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

于 2011-07-20T15:25:45.213 回答