-1

C スタイルの配列の場合、どうなるか float *fp1 = std::move(fp); 次のコード (1) のように、float *fp1 = fp; と同じですか。次のコード(2)のように、結果を出力すると同じようです。一般に、オブジェクトが移動可能でない場合、 std::move は何もしませんよね?

   int main(){
    float *fp = new float[20];
    //float *fp1 = std::move(fp); //(1)
    float *fp1 = fp; //(2)
    std::cout << "fp: " <<fp << " fp1: "<< fp1<< std::endl;
    unique_ptr<float> u_fp(fp);
    cout << "u_fp : "<< u_fp.get()<<endl;
    unique_ptr<float> u_fp1 = std::move(u_fp);

}
4

2 に答える 2

3

は配列float *fp = new float[20];fpはなく、20 個の float オブジェクトの配列の最初の要素へのポインターです。表示sizeof(fp)して確認できます。

ポインターは確かに移動可能な型であり、単純に移動またはコピーすることはまったく同じ操作です。移動不可能なタイプは、移動割り当て演算子を明示的に削除するか、移動すると移動不可能なサブオブジェクトが移動するため、移動割り当てが禁止されているタイプです。移動できないオブジェクトを移動しようとすると、コンパイル エラーが発生します。

ところで、真の C 配列を移動しようとすると、ポインターに減衰し、最初のケースと同じになります。

float arr[20];
float *fp1 = std::move(arr);  // arr decays to a pointer so the same as fp1 = arr
于 2020-07-01T07:12:45.120 に答える