1

3 つの質問があります。

  1. 左辺値を右辺値参照に直接バインドできますか?

  2. であるオブジェクトはどうなりますstd::move()か?

  3. std::move と の違いは何std::forwardですか?

struct myStr{
    int m_i;
};

void foo(myStr&& rs) { }

myStr rValueGene()
{
    return myStr();
}

int main() 
{
    myStr mS= {1};
    foo(rValueGene()); //ok passing in modifiable rvalue to rvalue reference

    // To Question 1:
    //below initilize rvalue reference with modifiable lvalue, should be ok
    //but VS2010 gives a compile error: error C2440: 'initializing' : cannot convert from    'myStr' to 'myStr &&' 
    //Is this correct ?
    myStr&& rvalueRef = mS;

    //by using std::move it seems ok, is this the standard way of doing this 
    //to pass a lvalue to rvalue reference
    //myStr&& rvalueRef = std::move(mS);

    // To Question 2:    
    //also what happens to mS object after std::move ?
    //destroyed , undefined ?
}
4

2 に答える 2

3

1>左辺値を右辺値参照に直接バインドできますか?

明示的なキャストがないわけではありません (つまり: std::move)。

2> std::move() であるオブジェクトはどうなりますか?

実際に移動するまでは何もありません。すべてstd::moveは、あなたが与えたものへの右辺値参照を返すことです。実際の移動は、問題の型の移動コンストラクター/代入で発生します。

3> std::move と std::forward の違いは何ですか?

std::move移動用です。std::forward転送用です。それはばかげているように聞こえますが、それがアイデアです。オブジェクトを移動する場合は、 を使用しますstd::move。オブジェクトを転送する場合は、 を使用しますstd::forward

転送は、参照の種類間の変換を可能にする特殊なセマンティクスを使用するため、呼び出し間で参照の性質が保持されます。これらすべての詳細は非常に... 技術的です。

std::move 常に&& を返します。左辺値参照を指定すると、右辺値参照が返されます。値の型を指定すると、その値への右辺値参照が返されます。などなど。

std::forward常に && を返すとは限りません。構文的にstd::forwardは、static_cast<T&&>. ただし、&& 型へのキャストに関する特殊な構文のため、このキャストは常に && を返すとは限りません。はい、それは奇妙ですが、転送の問題は解決されるので、誰も気にしません。そのためstd::forward、自分で明示的に行う必要はなく、 に含まれていstatic_castます。

于 2011-08-26T22:32:02.607 に答える
1

質問 1. はい、コンパイラは正しいです。

質問 2. 何も起こりません。std::move物事を右辺値にキャストするだけです。

ただし、に(または)std::moveを渡すために使用した場合、その関数はオブジェクトを「盗む」ことができると想定する可能性があり、関数呼び出し後に未指定の状態になる可能性があります。mSmyStrfoomS

于 2011-08-26T22:28:41.917 に答える