0

C++ でパラメーターを使用して、値/オブジェクトを保存したいと思います。この例では、単純化した例としてグローバル変数から値を格納しようとしています。

このコードは機能しません。

int value = 20;

void returnPointer2(int* hello)
{
    hello = &value;
}

// It changes nothing 
int value2 = 100; 
returnPointer2(&value2);
cout << value2 << endl;

ダブルポインターが必要だったので。

void returnPointer3(int** hello)
{
    *hello = &value;
}

int* vp2 = new int();
*vp2 = -30;  
returnPointer3(&vp2);
cout << *vp2 << endl; // expects 20

参照を思い出しました。ポインター参照を使用して同じ結果を得ることができます。

void returnPointer4(int* & hello)
{
    cout << "value : " << value;
    hello = &value;
}

int* vp3 = new int();
*vp3 = -130;  
returnPointer4(vp3); // also expects 20, but much simpler to use
cout << "better : " << *vp3 << endl;

ダブル&で試してみたところ、コンパイルされました。

void returnPointer5(int&& hello)
{
    cout << "value : " << value;
    hello = value;
}

ただし、整数変数の入力ではコンパイルされません。

int vp4 = 123; 
returnPointer5(vp4); // also expects 20, but even more simpler to use
cout << "best : " << vp4 << endl;

これはエラー メッセージです。

pointer_return.cpp:31:6: error:   initializing argument 1 of 'void returnPointer5(int&&)'
void returnPointer5(int&& hello)

たまたま について知っていたmoveのですが、このコードで動作します。

int vp4 = 123; 
returnPointer5(move(vp4)); // also expects 20, but much simpler to see
cout << "best : " << vp4 << endl;

moveこの関数の背後にある魔法/ロジックは何ですか?

4

3 に答える 3

1

最初の試行では、ポインターを値で渡し、関数内でそのアドレスを変更し、それが指しているものが変更されることを期待するという古典的な間違いを犯します。

コメントで述べたように、

void returnPointer2(int* hello)
{
    hello = &value; // don't do this, it only modifies what the 
                    // pointer hello, which resides in the stack, points to

    *hello = value; // do this instead. even though hello still resides in the                  
                    // stack, you're modifying the location that hello points to,
                    // which was your original intention

}

しかし、なぜポインタを渡したいのですか? 関数を呼び出すときに静的変数は使用できませんか? (ファイルが違うのかな?)

于 2013-06-17T22:16:35.273 に答える
1

std::move の魔法は次のとおりです。

std::move の実際の宣言はもう少し複雑ですが、本質的には右辺値参照への static_cast にすぎません。

ここから撮影。

Jeffery Thomas が既に述べたように、a&&は参照への参照ではなく、右辺値への参照です。

于 2013-06-17T22:16:59.270 に答える