5

次のコードを検討してください。

#include <iostream>
using namespace std;

typedef int array[12];

array sample;

array ret1(){   //won't compile
    return sample;
}

array& ret2(){
    return sample;
}

array&& ret3(){
    return sample;  //won't compile
}

void eat(array&& v){
    cout<<"got it!"<<endl;
}

int main(){
    eat(ret1());
    eat(ret2());    //won't compile
    eat(ret3());    //compiles, but I don't really know how to write a function that returns a rvalue-reference to an array
}

実際にコンパイルできるように見える唯一のバージョンはret3(). 実際、実装を省略して宣言するだけでもコンパイルは行われますが (もちろんリンクは行われません)、配列への右辺値参照を明示的に返す方法がわかりません。これが起こらない場合、配列への右辺値参照は禁止されていないが、使用できないと結論付けることができますか?

編集:

これが機能することに気付きました:

array&& ret3(){
    return std::move(sample);
}

今の楽しみは、実際の価値を理解することです...

4

1 に答える 1

4

さて、あなたは配列を右辺値として扱っています。一時的なオブジェクトと考えることができます。この情報は使用できますが、その内容を変更しても安全であることに注意してください。たとえば、print_sorted(array&)指定された配列のソートされた内容を出力する関数を書くことができます。これを行うには、特定のデータをシャッフルしたくないため、追加のバッファーで並べ替えることができます。しかし、print_sorted(array&&)prototype を使用した同じ関数は、オブジェクトが一時的なものであることを認識しているため、配列をその場でソートできます。

ただし、動的データが格納されていないプレーンなオブジェクトへの右辺値参照はあまり役に立ちません。

于 2012-02-03T23:10:40.140 に答える