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の想定されるmoveコンストラクターに右辺値を取得させます。値で返す場合、返されるオブジェクトは右辺値です。

運が良ければ、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

通常のユーザーとして、テンプレート ライブラリを実装していない人は、右辺値参照の唯一の用途は、ムーブ コンストラクターとムーブ代入を実装することです。

このビデオをチェックしてください 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 に答える